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
Dziękuję bardzo. Ten (oczywisty) błąd spowodował problem. – Lefteris
oznaczyć rozwiązanie jako zaakceptowane ... – Hades
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