Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么会导致异步任务不执行?_Android_Android Asynctask - Fatal编程技术网

Android 什么会导致异步任务不执行?

Android 什么会导致异步任务不执行?,android,android-asynctask,Android,Android Asynctask,我正在尝试解决的应用程序中有一个非常偶然的故障。进入应用程序时,主UI线程处理会在某一点结束,并将控制权传递给后台线程以检索某些数据。当检索到数据时,控件传递回主UI线程,以处理数据以进行显示。然而,在一些罕见的情况下(它99%的时间都能工作),AsyncTask似乎无法被调用,让应用程序永远处于糟糕的静态状态,等待AsyncTask完成 下面是活动中的代码快照: //method call from main UI thread private void fetchSomeData() {

我正在尝试解决的应用程序中有一个非常偶然的故障。进入应用程序时,主UI线程处理会在某一点结束,并将控制权传递给后台线程以检索某些数据。当检索到数据时,控件传递回主UI线程,以处理数据以进行显示。然而,在一些罕见的情况下(它99%的时间都能工作),AsyncTask似乎无法被调用,让应用程序永远处于糟糕的静态状态,等待AsyncTask完成

下面是
活动中的代码快照:

//method call from main UI thread
private void fetchSomeData() {
    Log.d("myTag", "In fecthSomeData()");
    new ReadFileAsyncTask<DataModel>().execute(this);
}
捕获此罕见故障的日志将导致:

In fetchSomeData()
...
(Other log messages from other interactions with the activity such as menu creation and navigation initialization)

但是,至关重要的是,不是
doInBackground
方法中第二行代码的log语句。我的一个想法是,这个日志语句失败了,但我没有看到任何强制停止消息、日志中的错误或ACRA崩溃报告。应用程序仍然处于活动状态(我可以导航到其他活动并返回),因此我不知道什么可能会阻止此后台线程正常运行。有什么想法吗?

遗憾的是
AsyncTask
不适合关键代码执行,因为根据
线程池的基本大小和最大大小,您的AsyncTask可能永远不会执行

此外,当它所引用的
活动
已被销毁(即其创建上下文)时,可以调用
onPostExecute
方法。您无法与之同步,而可能需要在UI线程的
AsyncThread
上使用join()

尽管我在Android摄像头应用程序中也看到过这样做,但阻止UI线程等待事件不是一个好主意,因为您可能会收到ANR(应用程序未运行)通知

看看这个:

如果需要更好的方法使工作线程与UIThread同步,请考虑使用
IntentServices
HandlerThread
ThreadPoolExecutors

发件人:

此外,IntentService不受大多数用户界面生命周期事件的影响,因此它会在关闭异步任务的情况下继续运行


在执行此任务时,您是否正在使用其他异步任务?或者这是唯一的异步任务?这是应用程序启动的第一个异步任务。我还有很多其他的,但是在这一个完成后,它们被调用。这是什么类型的安卓设备?你在别人身上试过吗?在我的Nexus 4上也试过,但在其他设备和操作系统版本上都有奇怪的用户报告。这是一个很难做到的。我没有主意了:\n原来蜂巢+上的核心线程池只有一个背景线程()。我的应用程序旁边运行着另一个服务,在异常情况下,它可以在相当长的时间内执行一个Aysnc任务,基本上占用了一个后台THAD。看起来是时候重新设计线程占用服务Asyc任务了。另请参见关于此主题的超级有用的问题和答案:
In fetchSomeData()
...
(Other log messages from other interactions with the activity such as menu creation and navigation initialization)