gpt4 book ai didi

android - onPostExecute 不会被调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:44 27 4
gpt4 key购买 nike

我有一个 Activity (RecipiesActivity),通过单击我的应用程序主 Activity 的“下一步”按钮打开。

在 RecipiesActivity onCreate 中,我想在 AsyncTask 中调用 Web 服务。目前,由于我还没有实现webservice,所以我只是调用bitly提供的webservice(但这与我的问题无关)。

问题是虽然调用了 webservice 并且没有抛出异常,但是从 doInBackground 返回了一个结果,但是我的 onPostExecute 没有被调用。我做了一些研究,发现了以下可能的原因 - 但似乎都不是我的情况:

  • onPostExecute 参数与 AsyncTask 参数不匹配 - 在我的例子中它们匹配
  • android 中的一个错误,它不允许在 UI 线程中执行 AsyncTask。据推测,它可以通过使用 Class.forName("android.os.AsyncTask") 来克服 - 我试过了,但没有任何区别
  • AsyncTask 不是从 UI 线程启动的 - 在我的例子中,我相信它是
  • doInBackground 不返回 - 在我的情况下它返回,我已经使用调试器逐步完成它
  • 在 onPostExecute 之前未使用@Override - 在我的例子中,我使用的是@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(),只需调用 AsyncTask 的 execute() 方法。调用 doInBackground() 就像它在 jar 头上所说的那样:调用 doInBackground()(在同一个线程中)并返回。它不会为您调用 onPostExecute()execute()会启动一个后台线程,在后台线程调用doInBackground(),然后将doInBackground()的结果传给onPostExecute() 在 UI 线程上。

关于android - onPostExecute 不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com