OnPostExecute не вызывается

У меня есть Activity (RecipiesActivity), который открывается нажатием кнопки «Далее» основного актива моего приложения.

В RecipiesActivity onCreate я хочу вызвать веб-сервис в AsyncTask. На данный момент, поскольку я еще не реализовал веб-сервис, я просто вызываю веб-сервис, предоставляемый по-битово (но это не имеет отношения к моей проблеме).

Проблема в том, что, хотя вебсервис получает вызов и не генерируется исключение, результатом является возврат из doInBackground, но мой onPostExecute не вызывается. Я провел некоторое исследование, и я нашел возможные причины, перечисленные ниже, но ни один из них не был моим делом:

  • Параметры onPostExecute не соответствуют параметрам AsyncTask – в моем случае они соответствуют
  • Ошибка в android, которая не разрешает выполнение AsyncTask в потоке пользовательского интерфейса. Это предположительно преодолевается с помощью Class.forName ("android.os.AsyncTask") – я пробовал это и не имел никакого значения
  • AsyncTask не запускается из потока пользовательского интерфейса – в моем случае я считаю, что это
  • DoInBackground не возвращается – в моем случае это происходит, я прошел через него с помощью отладчика
  • @Override не используется до onPostExecute – в моем случае я использую @Override

Код ниже:

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

Ваша помощь вызвана,

благодаря

Вместо doInBackground() просто вызовите метод execute() для AsyncTask. Вызов doInBackground() делает то, что он говорит на олове: вызывает doInBackground() (в том же потоке) и возвращает. Он не будет вызывать onPostExecute() для вас. doInBackground() запустит фоновый поток, вызовите doInBackground() в фоновом потоке, а затем doInBackground() результат doInBackground() в onPostExecute() в потоке пользовательского интерфейса.

Попробуйте изменить эту строку

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

в

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

Убедитесь, что функция onPostExecute имеет значение @Override