Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

  • Moderators
Δημοσ.

εχω μια συναρτηση η οποια επικοινωνει με ενα σερβερ..

για καποιο λογο δεν δουλευει τωρα η συναρτηση. εκανα αναβαθμιση το κινητο σε ICS κ αυτο φταιει αλλα δεν ξερω γιατι

η συναρτηση ειναι η αυτη που φαινεται παρακατω. αν εχει καποιος καμια ιδεα γιατι δεν δουλευει θα το εκτιμουσα

τωρα που εφτασα στο τελος της πτυχιακης δν δουλευει αυτη η @(*$#!$#!!!

 

>public void serverConnection(){
	HttpClient httpclient = new DefaultHttpClient();		
	HttpPost httppost = new HttpPost("http://rigel.sdo.teilar.gr/_uk/results.php?cuisineID=1&searchTerm=grill&mode=xml&submit=Search");
	httppost.getParams().setParameter(
			CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
	try
	{
	List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
			boolean comp;				
			SharedPreferences getPrefs = PreferenceManager
					.getDefaultSharedPreferences(getBaseContext());				
			nameValuePairs.add(new BasicNameValuePair("reson", "1"));
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			// Execute HTTP Post Request
			ResponseHandler<String> responseHandler = new BasicResponseHandler();				
			String response = httpclient.execute(httppost, responseHandler);
			FileOutputStream fOut = openFileOutput("data.xml",
					MODE_WORLD_READABLE);
			OutputStreamWriter osw = new OutputStreamWriter(fOut);
			osw.write(response);
			osw.flush();
			osw.close();				
		} catch (ClientProtocolException e) {
			Toast.makeText(this, "remote_services_is_not_accessible",
					Toast.LENGTH_LONG).show();
		} catch (IOException e) {				 
			Toast.makeText(this, "string.remote_services_is_not_accessible ",
					Toast.LENGTH_LONG).show();
		}			
		}

 

βρηκα τι φταιει. Η google απο την εκδοση Honeycomb και μετα υποχρεωνει ολα τα http request να γινονται στο background

οποτε πρεπει να το φτιαξω καπως με asynctask για να δουλεψει. οποιος εχει καποια ιδεα πανω σε αυτο δεκτη :)

Δημοσ.

Θα μπορούσες να βάλεις τον κώδικα στο doInBackground του AsyncTask, παρουσιάζοντας ένα απλό ProgressDialog αναμονής στο onPreExecute το οποίο θα ξεφορτωθείς με την ολοκλήρωση του doInBackground στο OnPostExecute.

 

Για περισσότερες λεπτομέρειες σχετικά με το AsyncTask δες εδώ (είναι αρκετά αναλυτικό).

 

Τέλος για την μεταφορά των αποτελεσμάτων θα μπορούσες να χρησιμοποιήσεις ένα custom Interface προσαρτημένο στις κλήσεις του OnPostExecute σου ή να χρησιμοποιήσεις κατευθείαν το Result πάντα με βάση τις ανάγκες του προγράμματος που αναπτύσσεις.

 

Υ.Γ.

Το AsyncTask θέλει προσοχή όσον αφορά τις αλλαγές στο Orientation της οθόνης πάντως, ίσως είναι καλύτερο να ακυρώσεις το εκ νέου φόρτωμα του Activity σε κάθε αλλαγή Orientation.

 

Καλή συνέχεια!!

Δημοσ.

Υ.Γ.

Το AsyncTask θέλει προσοχή όσον αφορά τις αλλαγές στο Orientation της οθόνης πάντως, ίσως είναι καλύτερο να ακυρώσεις το εκ νέου φόρτωμα του Activity σε κάθε αλλαγή Orientation.

 

Καλή συνέχεια!!

 

Να αγιάσει το στόμα σου....!! Του τα λέω και δε με ακούει..!

  • Moderators
Δημοσ.

για το progressDialog ειναι κατι τετοιο

protected void onProgressUpdate(Integer... progress) {

setProgressPercent(progress[0]);

}

αλλα πρεπει να ορισω εγω τη setProgressPercent ε? καμια ετοιμη δεν παιζει ? :P

τι εννοεις να ακυρωσω το εκ νέου φόρτωμα του Activity σε κάθε αλλαγή Orientation?

  • Moderators
Δημοσ.

λοιπον να κανω μια μικρη αναθεωρηση γιατι εχω μπερδευτει κ πρεπει να με βοηθησεις.

εχω δημιουργησει την κλαση που χρειαζεται. επειδη χρειαζομαι να διαβασω τις SHaredPreferences περναω σαν παραμετρο το Context(δεν ξερω αν χρειαζεται). στην doInBackground κανω την κληση που χρειαζεται τα επιστρεφει κανονικα και μετα στην onPostExecuteτο στρινγκ που περνω απο την προηγουμενη κληση το γραφω σε ενα αρχειο. μεχρι εδω ολα καλα. πως θα ξερω σιγουρα οτι η κληση κ η εγγραφη του αρχειου εγινε πριν καλεσω την επομενη εντολη μου μεσα στην αρχικη μου κλαση.?

πες μου αν ειναι σωστο οτι εχω κανει ή αν θελει καποια διορθωση

>public class ServerConnection extends AsyncTask <Context, Void, String> {
Context mapContext;
String response = null;

public ServerConnection(Context baseContext) {
	mapContext = baseContext;
}

protected void onPostExecute(String result) {
       Toast.makeText(mapContext, result, 4000).show(); 
       FileOutputStream fOut = null;
	try {
		fOut = mapContext.getApplicationContext().openFileOutput("data.xml",Context.MODE_WORLD_READABLE);
		OutputStreamWriter osw = new OutputStreamWriter(fOut);
		osw.write(response);
		osw.flush();
		osw.close();
	} catch (FileNotFoundException e) {		
		e.printStackTrace();
	} catch (IOException e) {			
		e.printStackTrace();
	}
	
   }

protected String doInBackground(Context... params) {
	HttpClient httpclient = new DefaultHttpClient();
	HttpPost httppost = new HttpPost("http://130.43.32.65/gasFinder/gasFinder");
	httppost.getParams().setParameter(
			CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
	List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
	boolean comp;		
	nameValuePairs.add(new BasicNameValuePair("reson", "1"));
	try {
		httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
		ResponseHandler<String> responseHandler = new BasicResponseHandler();
		response = httpclient.execute(httppost, responseHandler);
		return response;
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	return response;
}
}

Δημοσ.

 

 

λοιπον να κανω μια μικρη αναθεωρηση γιατι εχω μπερδευτει κ πρεπει να με βοηθησεις.

εχω δημιουργησει την κλαση που χρειαζεται. επειδη χρειαζομαι να διαβασω τις SHaredPreferences περναω σαν παραμετρο το Context(δεν ξερω αν χρειαζεται). στην doInBackground κανω την κληση που χρειαζεται τα επιστρεφει κανονικα και μετα στην onPostExecuteτο στρινγκ που περνω απο την προηγουμενη κληση το γραφω σε ενα αρχειο. μεχρι εδω ολα καλα. πως θα ξερω σιγουρα οτι η κληση κ η εγγραφη του αρχειου εγινε πριν καλεσω την επομενη εντολη μου μεσα στην αρχικη μου κλαση.?

πες μου αν ειναι σωστο οτι εχω κανει ή αν θελει καποια διορθωση

>public class ServerConnection extends AsyncTask <Context, Void, String> {
Context mapContext;
String response = null;

public ServerConnection(Context baseContext) {
	mapContext = baseContext;
}

protected void onPostExecute(String result) {
       Toast.makeText(mapContext, result, 4000).show(); 
       FileOutputStream fOut = null;
	try {
		fOut = mapContext.getApplicationContext().openFileOutput("data.xml",Context.MODE_WORLD_READABLE);
		OutputStreamWriter osw = new OutputStreamWriter(fOut);
		osw.write(response);
		osw.flush();
		osw.close();
	} catch (FileNotFoundException e) {		
		e.printStackTrace();
	} catch (IOException e) {			
		e.printStackTrace();
	}
	
   }

protected String doInBackground(Context... params) {
	HttpClient httpclient = new DefaultHttpClient();
	HttpPost httppost = new HttpPost("http://130.43.32.65/gasFinder/gasFinder");
	httppost.getParams().setParameter(
			CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
	List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
	boolean comp;		
	nameValuePairs.add(new BasicNameValuePair("reson", "1"));
	try {
		httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
		ResponseHandler<String> responseHandler = new BasicResponseHandler();
		response = httpclient.execute(httppost, responseHandler);
		return response;
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	} catch (ClientProtocolException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	return response;
}
}

 

 

Αν έχω καταλάβει το ερώτημα σου..

 

Θα μπορούσες να ενημερώνεις για την επιτυχή ή μη επιτυχή έκβαση των εντολών του AsyncTask σου, το υπόλοιπο πρόγραμμα μέσο ενός Interface (ας το πούμε ServerConnectionListener) το οποίο θα περιείχε 3 παραμέτρους, το response (String) με τα δεδομένα σου, το cancelled (boolean) που όταν είναι true υποδεικνεί ότι ο χρήστης ακύρωσε το AsyncTask και ένα Exception (e) το οποίο όταν δεν είναι null υποδυκνύει ότι παρουσιάστηκε σφάλμα κατά την εκτέλεση του AsyncTask.

 

Επίσης θα μπορούσες να μεταφέρεις τον κώδικα του onPostExecute εντός του doInBackground (ώστε να μην χρειάζεται περαιτέρο έλεγχος επιτυχίας ή αποτυχίας σε άλλο ένα σημείο) και προσθέτοντας στο onPostExecute απλά την κλήση προς το Interface (ServerConnectionListener) για ενημέρωση του υπόλοιπου προγράμματος.

 

Ακολουθούν 3 πηγαία αρχεία.

 

1ο) Το κεντρικό πρόγραμμα (ServerTesterActivity)

 

>
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class ServerTesterActivity extends Activity implements ServerConnectionListener {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       ServerConnection srvcon = new ServerConnection(this, this);
       srvcon.execute();
   }

@Override
public void ServerConnectionComplete(String response, final boolean cancelled, Exception e) {
	
	if(cancelled)
		Toast.makeText(this, "user abort", Toast.LENGTH_SHORT).show();
	else		
		if(e == null)
			Toast.makeText(this, response, 4000).show();
		else
			Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
}  
}

 

 

2ο) Το Interface επικοινωνίας του ServerConnection (ServerConnectionListener)

 

>
public interface ServerConnectionListener {

public void ServerConnectionComplete(String response, final boolean cancelled, Exception e); 
}

 

 

3ο) Το ServerConnection AsyncTask (ServerConnection)

 

>
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreProtocolPNames;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class ServerConnection extends AsyncTask <Context, Void, String> {
   Context mapContext;
   String response = null;    
   Exception lastException = null;
   ServerConnectionListener listenerCL = null;
   ProgressDialog PD;

   public ServerConnection(Context baseContext, ServerConnectionListener listenerCL) {
           mapContext = baseContext;
           this.listenerCL = listenerCL;
   }
   
   protected void onPreExecute()
   {
   	PD = ProgressDialog.show(mapContext, "", "Connecting ...");
   }
   
   protected void onPostExecute(String result) {    	    	
   	PD.dismiss();    	
   	listenerCL.ServerConnectionComplete(result, isCancelled(), lastException);        
   }

   protected String doInBackground(Context... params) {
   		    	
           HttpClient httpclient = new DefaultHttpClient();
           HttpPost httppost = new HttpPost("http://130.43.32.65/gasFinder/gasFinder");
           httppost.getParams().setParameter(
                           CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
           boolean comp;           
           nameValuePairs.add(new BasicNameValuePair("reson", "1"));
           try {
                   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                   ResponseHandler<String> responseHandler = new BasicResponseHandler();
                   response = httpclient.execute(httppost, responseHandler);
                   return response;
           } catch (UnsupportedEncodingException e) {
           		lastException = e;
                   e.printStackTrace();                    
           } catch (ClientProtocolException e) {
           		lastException = e;
                   e.printStackTrace();                    
           } catch (IOException e) {
           		lastException = e;
                   e.printStackTrace();
           } catch (Exception e) { // When everything else fails
           	lastException = e;
           	e.printStackTrace();
           }
           
           if(lastException != null)
           	return null;
           
	    FileOutputStream fOut = null;
	            try {
	                    fOut = mapContext.getApplicationContext().openFileOutput("data.xml",Context.MODE_WORLD_READABLE);
	                    OutputStreamWriter osw = new OutputStreamWriter(fOut);
	                    osw.write(response);
	                    osw.flush();
	                    osw.close();
	            } catch (FileNotFoundException e) {
	            		lastException = e;
	            		e.printStackTrace();
	            } catch (IOException e) {
	            		lastException = e;
	                    e.printStackTrace();
	            }
	                       
           return response;
   }
} 

 

 

* Σημείωση: Για την ιστορία, ο κώδικας του doInBackground φαίνεται ότι διακόπτει με ClientProtocolException.

 

τι εννοεις να ακυρωσω το εκ νέου φόρτωμα του Activity σε κάθε αλλαγή Orientation?

Μπορείς να ζητήσεις από το Android να διαχειρίζεσαι μόνος σου την αλλαγή προσανατολισμού της οθόνης (ή και άλλων αλλαγών) μέσο της Activity.onConfigurationChanged (θα πρέπει να ορίσεις στο Manifest σου ποίες αλλαγές θες να διαχειρίζεσαι μόνος σου όμως -βλ. configChanges).

 

Όταν το Android σε ενημερώσει (αντί να κάνει μόνο του ότι χρειάζεται) ότι έγινε κάποια αλλαγή (πχ. προσανατολισμού) μέσο του Activity.onConfigurationChanged, απλά την αγνοείς (άρα το σύστημα δεν φορτώνει εκ νέου το Activity σου -και *καλό & κακό) με ένα super.onConfigurationChanged(..));

 

*Καλό, διότι το Activity σου αλλάζει τον προσανατολισμό του ακαιριαία.

Κακό, διότι υπό ορισμένες προϋποθέσεις μπορεί να χρειασθεί να ενημερώσεις μόνο σου (στο Activity.onConfigurationChanged) το UI για τον νέο προσανατολισμό (να φορτώσεις μόνος σου πχ. κάποια resources κλπ).

 

Να αγιάσει το στόμα σου....!! Του τα λέω και δε με ακούει..!

Μεγάλο μπέρδεμα το Android.. :D

  • Moderators
Δημοσ.

να δω αν καταλαβα τα παντα! :P

 

καλουμε την ServerConnection απο την αρχικη κλαση.

Εκτελειτε η πριεξεκιουτ και εμφανιζει το διαλογο προοδου. μετα παμε στη ντοΙνΜπακγκραουντ οπου κανω ολα τα υπολοιπα

και τελος παμε στην ποστΕξεκιουτ οπου ενημερωνουμε το σερβερΚονεξιονΛιστενερ που εχουμε στην αρχικη μας κλαση!

τωρα μενει να δω αν δουελευι κ η εμφανιση των δεδομενων. γιατι εχτες οταν εβγαινα απο το μενου της εφαρμογης που ειχα κανει τις αλλαγες στις ρυθμισεις ενω γινοταν η συνδεση κ εγραφα στο αρχειο τα δεδομενα που ηθελα δεν μου τα εμφανιζε

και επρεπε να βγω απο την εφαρμογη και να ξαναμπω για να τα εμφανιση. αλλα τηα το δοκιμασω και σημερα κ θα δουμε.

 

εχω ορισει τον προσανατολισμο της οθονης να ειναι σταθερος οποτε δεν μπορει να υπαρξουν κ πολλες αλλαγες :P

ο αλλος μου ελεγε να μην τα εχω ολα στην onCreate() :P

 

Οσο για το μεγαλο μπερδεμα δε λες τιποτα. Οταν καταλαβα τι φταιει και δεν δουλευε και οτι επρεπε να ξαναφτιαξω κατι στην εφαρμογη σκεφτηκα να περασω gingerbread μεχρι να κανω την παρουσιαση κ να τελειωνω :P

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...