2015-05-20 64 views
3

在我的应用程序中,我有一个活动A,它承载着FragmentsAsyncTasks需要几秒钟的时间才能启动

从(孩子)Activity B,我在Activity A中显示一个具体的Fragment,然后完成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执行后,才日志“的AsyncTask #XX调用分离() 但我不知道这意味着什么。

+0

什么是LogUtil的,以及它是如何看起来像?它是否比'Log.e(TAG,“显示progressLoader”);'?有什么优势? – Squirrelkiller

+0

LogUtil是一个自定义类,它在SD中执行Log.e和文件日志以用于调试目的。看它就像一个简单的日志。 – Apollo

+0

我是否理解正确:在加载屏幕的开启和日志中的“doInBackground start”之间最多10秒?你可以把log.e放到任何地方看看确切的代码行。 – Squirrelkiller

回答

0

我找到了!

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

解决办法有两个:

  • 取消其他任务

  • 在并行执行,执行此任务:

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

DataReceiver确实只有开始时你的”做UI的东西“,这可能是最好的,如果你的onPostExecute()想要访问该UI的东西。

你当然可以把”UI东西“放在DataReceiver的onExExcute中,减去需要的东西在onCreateView(不知道这里,只是不想摧毁任何东西,我猜想inflater.inflate(stuff)需要返回)

您也可以启动一个AsyncTask,它只会下载和/或计算onCreate中的内容,并在onPostExecute(例如someHandler.post(updateUIRunnable))中设置某种回调或某种内容。

相关问题