android - AsyncTask 方法 doInBackground() 如何知道何时完成?
问题描述
我有一个HttpPostAsyncTask
扩展类,AsyncTask
用于将数据发送到我的快速服务器并从中获取响应。现在,虽然返回了响应并且我将响应作为字符串返回,但该doInBackground()
方法并未完成,因此AsyncTask
仍在运行。
我的doInBackground()
方法如下所示:
URL url = new URL(params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
int statusCode = urlConnection.getResponseCode();
switch (statusCode) {
case 400:
return "Error 400 - Bad request.";
case 401:
return "Error 401 - Unauthorized request.";
}
现在,当我登录时statusCode
,我得到了正确的结果。但该doInBackground()
方法并未结束,因此该任务仍在运行。
我在互联网上搜索了很多地方,但无法找到究竟是什么触发了该doInBackground
方法的结束?如果结束,我想 AsyncTask 也应该结束,我可以在onPostExecute()
方法中接收结果。
编辑1:
所以我有一个调用startActivityForResult
两次的活动A。首先,我有一个GoogleSignInIntent
,我正在呼吁startActivityForResult
。如果它正确返回结果,我会startActivityForResult
再次调用(requestCode
显然不同)。现在,我按照这篇文章statusCode
,为方法中的所有s实现了一个CustomCallback doInBackground()
。我还在doInBackground()
.
所以 GoogleSignInIntent 正确返回结果,我开始下一个意图,我的服务器为此返回正确的响应代码,我调用自定义回调处理程序并从我的doInBackground()
. 仍然onPostExecute()
没有调用。
解决方案
请务必注意,您需要将内部类声明为静态,因为它们不包含对活动的引用以避免内存泄漏。当您的活动完成时,您还需要取消异步任务(例如 onDestroy() 方法)。要了解有关此主题的更多信息,请查看这篇中篇文章关于 Android 应用程序中的内存泄漏你需要知道的一切。
private AsyncTask mHttpPostAsyncTask;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHttpPostAsyncTask = new HttpPostAsyncTask().execute();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mHttpPostAsyncTask != null) {
mHttpPostAsyncTask.cancel(true);
}
}
// --------------------------------------------------------------------------
// Inner Classes
// --------------------------------------------------------------------------
private static class HttpPostAsyncTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
URL url = new URL(params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
int statusCode = urlConnection.getResponseCode();
switch (statusCode) {
case 400:
return "Error 400 - Bad request.";
case 401:
return "Error 401 - Unauthorized request.";
}
return null;
}
@Override
protected void onPostExecute(String s) {
// doInBackground() has finished. Do something with your string.
// Remember to check that it isn't null to avoid NPE.
if (s != null) {
// do something with the result.
}
}
}
推荐阅读
- python - python **kwargs 和 threading.Timer 不工作
- events - 如何在 Erlang 中使用 gen_event 调用?
- javascript - 在javascript中显示行
- python - 使用 CNN Keras 进行多图像分类
- php - PHP urlencode 问题与我的字符串中的一个参数:“¬ify_url”错误地返回“¬ify_url”
- android - com.google.firebase.Timestamp 无法在 koltin/android studio 中转换为 java.util.Date
- c - C 中 asctime() 产生的字符串缓冲区溢出
- performance - Pig 在本地模式与 mapreduce 模式下的性能
- highcharts - 在 Highcharts 包装气泡外圈上显示 dataLabels 或工具提示
- python - django,什么问题?TypeError Comment() 得到了一个意外的关键字参数“comment_text”