【发布时间】:2014-04-06 04:24:05
【问题描述】:
在fragment 中使用Asynctask 时,我遇到了一个很奇怪的问题,
在Fragment 的onCreate 中,我这样称呼AsyncTask:
@Override
public void onCreate(Bundle savedInstanceState) {
// Step 1
new FitnessHistoryDataAsync(getActivity()).execute(10);
super.onCreate(savedInstanceState);
}
和doInBackground 方法:
@Override
protected Boolean doInBackground(Integer... params) {
// Step 2
Log.i("", "doInBackground");
Constants.SDK.getFitnessHistoryData(context, 10,
new FitnessHistoryListener() {
@Override
public void onReceiveFailed(String errorMessage) {
// Step 4
Log.i("", "error " + errorMessage);
}
@Override
public void onReceiveData(
FitnessHistory[] fitnessHistoryData) {
// Step 4
Log.i("", "onReceiveData");
}
});
return true;
}
和onPostExecute 方法:
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
// Step 3
Log.i("", "onPostExecute");
// Hide progress bar dialog
Constants.connectivity.hideProgressDialog();
}
我的Asynctask 运行如下:Step 1、Step 2、Step 3,然后是Step 4。
问题出在doInBackground 方法中,其中Step 2 和Step 4 在onPostExecute 方法中运行Step 3 之前不能同时运行。
我希望在转到 onPostExecute 方法之前运行 doInBackground 方法中的所有内容。
请帮帮我。
谢谢。
编辑:
我改成如下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Step 1
new FitnessHistoryDataAsync(getActivity()).executeonExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 10);
}
虽然我使用AsyncTask.THREAD_POOL_EXECUTOR 或AsyncTask.SERIAL_EXECUTOR 尝试解决此问题,但不能。
【问题讨论】:
-
Constants.SDK.getFitnessHistoryData 的真正作用是什么?让它在另一个线程上运行吗?
-
@AbolhassanAbdolalizade :我不知道,因为它是我使用的库。如果是另一个线程。我该如何解决这个问题家伙?请帮帮我。
-
看起来
onReceiveFailed和onReceiveData是getFitnessHistoryData触发的异步回调。如果是这种情况,您可能不需要为此使用 AsyncTask。只需调用getFitnessHistoryData,并将onPostExecute代码放入这些回调中。请注意,您可能必须将任何涉及 UI 的代码发布到主线程。 -
@Velox:我试过了。将所有代码放入
onPostExecute方法中。但是我在这篇文章中所说的生命周期仍然是一样的。touches the UI to the main thread- 在后台线程完成之前它仍然到达 UI
标签: android android-fragments android-asynctask