Chr*_*ght 5 android android-asynctask
我的应用程序中有一个非常零星的失败,我正试图解决.在进入应用程序时,主UI线程处理结束并将控制权传递给后台线程以检索某些数据.检索数据时,控件会传回主UI线程进行处理以进行显示.然而,在一些罕见的场合(它在99%的时间内工作),AsyncTask似乎无法被调用,使应用程序处于一个不稳定的静态状态,永远等待AsyncTask完成.
这是以下代码的快照Activity:
//method call from main UI thread
private void fetchSomeData() {
Log.d("myTag", "In fecthSomeData()");
new ReadFileAsyncTask<DataModel>().execute(this);
}
Run Code Online (Sandbox Code Playgroud)
这是ReadFileAsyncTask实施:
public class ReadFileAsyncTask<A> extends AsyncTask<I_ReadFileListener<A>, Void, A>
{
I_ReadFileListener<A> listener;
@Override
@SuppressWarnings("unchecked")
protected A doInBackground(I_ReadFileListener<A>... params)
{
listener = params[0];
Log.d("mytag", "BACKGROUND: Loading " + listener.getFilename() + " from disk");
A fileContents = (A) FileUtils.readDataFromInternalStorage(listener.getContext(), listener.getFilename());
return fileContents;
}
@Override
protected void onPostExecute(A result)
{
Log.d("myTag", "FOREGROUND: Executing onFileRetrieved listener");
listener.onFileRetrieved(result);
}
}
Run Code Online (Sandbox Code Playgroud)
捕获这个罕见故障日志:
In fetchSomeData()
...
(Other log messages from other interactions with the activity such as menu creation and navigation initialization)
Run Code Online (Sandbox Code Playgroud)
但是,至关重要的是,不是doInBackground方法中第二行代码的日志语句.我有一个想法是这个日志声明失败了,但我没有看到任何强制停止消息,我的日志或ACRA崩溃报告中的错误.应用程序仍处于活动状态(我可以导航到其他活动并返回),因此我不知道是什么可能会阻止此后台线程正常运行.有任何想法吗?
遗憾的AsyncTask是,它不适合关键代码执行,因为根据ThreadPool基本大小和最大大小,您的 AsyncTask 可能永远不会执行。
此外,当它所引用的(即它的创建上下文)已经被销毁onPostExecute时,可以调用该方法。Activity您无法与其同步,只能在AsyncThreadUI 线程上使用 join() 。
尽管我在 Android 相机应用程序中也看到过这样做,但阻止 UI 线程等待事件并不是一个好主意,因为您可能会收到 ANR(应用程序未运行)通知。
看看这个:AsyncTask 真的在概念上有缺陷还是我只是错过了一些东西?
考虑使用IntentServices,HandlerThread或者ThreadPoolExecutors如果您需要一种可能更好的方法来将工作线程与 UIThread 同步。
来自http://developer.android.com/training/run-background-service/create-service.html:
此外,IntentService 不受大多数用户界面生命周期事件的影响,因此它会在会关闭 AsyncTask 的情况下继续运行
| 归档时间: |
|
| 查看次数: |
492 次 |
| 最近记录: |