2012-08-27 35 views
5

Mam działalność (RecipiesActivity), która jest otwierana przez kliknięcie przycisku "Dalej" w głównym działaniu mojej aplikacji.Usługa onPostExecute nie jest wywoływana

W RecipiesActivity onCreate, chcę wywołać usługa sieci web w AsyncTask. Na razie, ponieważ nie zaimplementowałem jeszcze usługi sieciowej, po prostu wywołuję usługę sieciową dostarczoną przez bitowe (ale to nie ma związku z moim problemem).

Problem polega na tym, że chociaż usługa sieciowa zostanie wywołana i nie zostanie zgłoszony żaden wyjątek, wynikiem jest powrót z pola doInBackground, ale mój onPostExecute nie jest wywoływany. Zrobiłem rozeznanie i znalazłem możliwych przyczyn wymienionych poniżej - ale żaden nie wydaje się być mój przypadek:

  • onPostExecute parametry nie odpowiadają parametry AsyncTask - w moim przypadku były zgodne
  • błąd w Android, który nie zezwala na wykonanie zadania AsyncTask w wątku interfejsu użytkownika. Jest supposadely pokonuje za pomocą Class.forName („android.os.AsyncTask”) - to próbowałem i nie robi żadnej różnicy
  • AsyncTask nie został uruchomiony z wątku UI - w moim przypadku uważam, że jest
  • doInBackground nie wraca - w moim przypadku to robi, ja przeszedł przez nią z debuggera
  • @Override nie jest używany przed onPostExecute - w moim przypadku używam @Override

Kod jest poniżej:

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); 
      } 
     }  
    } 
} 

Twoja pomoc jest appreceiated,

dzięki

Odpowiedz

5

Zamiast doInBackground(), wystarczy wywołać metodę z AsyncTask execute(). Wywołanie doInBackground() robi to, co mówi na blaszce: dzwoni doInBackground() (w tym samym wątku) i zwraca. Nie zadzwoni on pod numer onPostExecute(). execute() rozpocznie wątek tła, zadzwoń doInBackground() na wątek tła, a następnie opublikować wynik doInBackground() do onPostExecute() na wątku interfejsu użytkownika.

+0

Dziękuję bardzo. Ten (oczywisty) błąd spowodował problem. – Lefteris

+0

oznaczyć rozwiązanie jako zaakceptowane ... – Hades

+0

Chciałem to zrobić zaraz po wysłaniu, ale wymagało to ode mnie czekania około 7-10 minut. W każdym razie odpowiedź jest zaznaczona teraz :) – Lefteris

3

Spróbuj zmienić tę linię

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

do

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

Dziękuję, to był oczywisty i głupi błąd. Zaznaczę to również jako odpowiedź, ale niestety mogę tylko oznaczyć jeden. – Lefteris

+1

Nieważne, cieszę się, że zadziałało, ale możesz zaakceptować komentarz, jeśli był przydatny. – mtekeli

1

Upewnij się, że funkcja onPostExecute ma @Override

Powiązane problemy