2012-08-27 31 views
5

Ich habe eine Aktivität (RecipiesActivity), die durch Klicken auf die Schaltfläche "Weiter" der Hauptaktivität meiner Anwendung geöffnet wird.onPostExecute wird nicht aufgerufen

In den RecipiesActivity onCreate möchte ich einen Webdienst in einer AsyncTask aufrufen. Für den Moment, da ich den Webservice noch nicht implementiert habe, rufe ich nur einen Webservice an, der von Bitly bereitgestellt wird (aber das ist irrelevant für mein Problem).

Das Problem ist, dass, obwohl der Webservice aufgerufen wird und keine Ausnahme ausgelöst wird, ist ein Ergebnis Rückgabe von der DoInBackground, aber meine onPostExecute wird nicht aufgerufen. Ich habe einige der Forschung getan, und ich habe die möglichen Gründe, wie nachstehend aufgeführt gefunden - aber keiner scheint mein Fall zu sein:

  • OnPostExecute Parameter stimmen nicht überein, die AsyncTask Parameter - in meinem Fall, dass sie
  • Ein Bug passen in Android, das nicht zulässt, dass die AsyncTask im UI-Thread ausgeführt wird. Es ist supposadely windet durch Class.forName mit („android.os.AsyncTask“) - Ich habe versucht, diese und machen keinen Unterschied
  • AsyncTask nicht aus dem UI-Thread gestartet wird - in meinem Fall ich glaube, es ist
  • doInBackground nicht zurück - in meinem Fall hat es, ich habe
  • durch sie mit dem Debugger trat
  • @Override nicht vor OnPostExecute verwendet wird - in meinem Fall verwende ich @Override

der Code ist unten:

public class RecipiesActivity extends Activity { 

    private TextView tv; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_recipies); 
     tv = (TextView) findViewById(R.id.Response); 

     //Start the WS call in an AsyncTask 
     new CallWS().doInBackground("https://api-ssl.bitly.com/v3/shorten?login=maskedLogin&apiKey=maskedKey&longUrl=http%3A%2F%2Fgoogle.com%2F");   
    } 

    private class CallWS extends AsyncTask<String, Integer, String> 
    { 
     @Override 
     protected String doInBackground(String... params) { 

      String result = null; 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpGet get_request = new HttpGet(params[0]); 
      try 
      { 
       HttpResponse httpResponse = httpClient.execute(get_request, localContext); 
       //int responseCode = httpResponse.getStatusLine().getStatusCode(); 
       HttpEntity entity = httpResponse.getEntity(); 
       if (entity != null) 
       { 
        InputStream istream = entity.getContent(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(istream)); 

        try 
        { 
         result = br.readLine(); 
        } 
        catch (Exception e) 
        { 
         //TODO Handle the IOException that the readline may throw 
        } 
        finally 
        { 
         istream.close(); 
        } 
       } 

      }catch (Exception e) 
      { 
       //TODO Handle the IOException and the ClientProtocolException that the 
       // httpClient.execute can throw 
      } 
      finally 
      { 
       httpClient.getConnectionManager().shutdown(); 
      } 
      return result; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      if (result == null) 
      { 
       tv.setText("The result is NULL"); 
      } 
      else 
      { 
       tv.setText(result); 
      } 
     }  
    } 
} 

Ihre Hilfe ist appreceiated,

dank

Antwort

5

Statt doInBackground() einfach die execute() Methode des AsyncTask nennen. Aufruf doInBackground() macht, was es auf dem Blech sagt: Anrufe doInBackground() (im selben Thread) und kehrt zurück. Es wird nicht onPostExecute() für Sie anrufen. execute() wird ein Hintergrundthread starten, rufen Sie doInBackground() auf dem Hintergrundthread auf und dann das Ergebnis doInBackground() zu onPostExecute() auf dem UI-Thread.

+0

Vielen Dank hat zu ändern. Dieser (offensichtliche) Fehler hat das Problem verursacht. – Lefteris

+0

markieren Sie die Lösung als akzeptiert ... – Hades

+0

Ich würde es tun, direkt nachdem es gepostet wurde, aber es forderte mich auf etwa 7-10 Minuten warten, bevor Sie dies tun. Wie auch immer, Antwort ist jetzt markiert :) – Lefteris

3

Versuchen Sie diese Zeile

new CallWS().doInBackground("https://api-ssl.bitly.com/v3/shorten?login=maskedLogin&apiKey=maskedKey&longUrl=http%3A%2F%2Fgoogle.com%2F"); 

zu

new CallWS().execute("https://api-ssl.bitly.com/v3/shorten?login=maskedLogin&apiKey=maskedKey&longUrl=http%3A%2F%2Fgoogle.com%2F"); 
+0

Danke, das war der offensichtliche und dumme Fehler, der gemacht wurde. Ich würde dies auch als eine Antwort bezeichnen, aber unglücklicherweise kann ich nur eine markieren. – Lefteris

+1

Es macht nichts, froh, dass es funktioniert hat, aber Sie können den Kommentar verbessern, wenn es für Sie nützlich war. – mtekeli

1

Stellen Sie sicher, Ihre OnPostExecute Funktion @Override