AsyncTasks需要几秒钟才能启动

时间:2015-05-20 15:57:14

标签: android android-asynctask

在我的应用中,我有一个托管Fragments的活动A.

从(孩子)Activity B,我在Fragment中显示特定Activity A,然后结束B.让我们调用此Fragment F1。 在F1中,我创建了一个AsyncTask来从我的数据库中读取数据。 AsyncTask是在F1 onCreateView方法结束时创建的。

有效的调用堆栈是这样的:

B onDestroy

F1 OnCreate

Task onPreExecute

A onResume

F1 OnResume

任务doInBackground

Task.doInBackground在执行前最多可能需要10秒钟。

我的问题是:为什么执行这么长的任务?根据调用堆栈,我认为Task在启动之前等待Thread UI完成。或者这不是AsyncTask的预期行为。

这是我的代码:

private class DataRetriever extends AsyncTask<Void, Void, Void>{

    @Override
    protected void onPreExecute(){
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        LogUtil.LOGE("Executing AnalyseScreen.DataRetriever onPreExecute");
        // display a loader on screen while user is waiting
        progressLoader.setVisibility(View.VISIBLE);

    }

    @Override
    protected Void doInBackground(Void... params) {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        LogUtil.LOGD("Data retreiver : doInBackground start");
        reloadDatas();
        return null;
    }


    @Override
    protected void onPostExecute(Void result){
        // hide loader then update UI
        progressLoader.setVisibility(View.GONE);
        updateUI();
    }
}

F1 onCreateView:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
     // doing UI stuff
     new DataRetriever().execute();
}

有什么想法?

[编辑] onCreateView中注释中描述的UI内容是膨胀视图,初始化View的变量并初始化布局中的一些ClickListener。 除此之外,F1可直接从A访问,而不是来自B.

F1总结了一些数据,可以直接访问。 B是数据循环的结束。此时,我希望用户直接查看他的历史记录。就像一个正在运行的应用程序

任务doInBackground仅在log&#34; AsyncTask #XX调用detach()之后执行 但我不知道这意味着什么。

2 个答案:

答案 0 :(得分:0)

DataReceiver确实只是在你的“做UI事情”完成时开始,如果你的onPostExecute()想要访问那些UI东西,这可能是最好的。

你当然可以将“UI内容”放在DataReceiver s onPreExecute中,减去需要在onCreateView中的内容(这里不确定,只是不想破坏任何内容,我猜是{{需要返回的1}}。

您还可以启动AsyncTask,它只会下载和/或计算inflater.inflate(stuff)中的内容,并在onCreate(例如onPostExecute)中设置某种回调或类似内容。< / p>

答案 1 :(得分:0)

我找到了它!

我的应用程序中有很多AsyncTasks,而来自Activity B的这个似乎正在排队并等待其他人完成。

有两种解决方案:

  • 取消其他任务

  • 在并行执行程序中执行此任务:

    new DataRetreiver().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void)null);