【问题标题】:doInBackground run so fast when using AsyncTask in Fragment在 Fragment 中使用 AsyncTask 时 doInBackground 运行得如此之快
【发布时间】:2014-04-06 04:24:05
【问题描述】:

fragment 中使用Asynctask 时,我遇到了一个很奇怪的问题,

FragmentonCreate 中,我这样称呼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 1Step 2Step 3,然后是Step 4

问题出在doInBackground 方法中,其中Step 2Step 4onPostExecute 方法中运行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_EXECUTORAsyncTask.SERIAL_EXECUTOR 尝试解决此问题,但不能。

【问题讨论】:

  • Constants.SDK.getFitnessHistoryData 的真正作用是什么?让它在另一个线程上运行吗?
  • @AbolhassanAbdolalizade :我不知道,因为它是我使用的库。如果是另一个线程。我该如何解决这个问题家伙?请帮帮我。
  • 看起来onReceiveFailedonReceiveData是getFitnessHistoryData触发的异步回调。如果是这种情况,您可能不需要为此使用 AsyncTask。只需调用getFitnessHistoryData,并将onPostExecute 代码放入这些回调中。请注意,您可能必须将任何涉及 UI 的代码发布到主线程。
  • @Velox:我试过了。将所有代码放入onPostExecute 方法中。但是我在这篇文章中所说的生命周期仍然是一样的。 touches the UI to the main thread - 在后台线程完成之前它仍然到达 UI

标签: android android-fragments android-asynctask


【解决方案1】:

super.onCreate(savedInstanceState); 之前调用new FitnessHistoryDataAsync(getActivity()).execute(10); 是您应该首先解决的问题。
将其更改为类似的内容

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Step 1 
    new FitnessHistoryDataAsync(getActivity()).execute(10);

}

【讨论】:

  • 您好,我已经像您一样更改了编码,但无法解决我的问题。
【解决方案2】:

看起来我使用的库也是另一个线程。 所以,我不需要创建新线程AsyncTask

只需像这样编辑编码:

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

        // TODO Directly updated UI in here when already received new data
    }
});

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多