Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.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 为什么异步任务';的postExecute方法未在UI线程中运行?_Android_Android Asynctask - Fatal编程技术网

Android 为什么异步任务';的postExecute方法未在UI线程中运行?

Android 为什么异步任务';的postExecute方法未在UI线程中运行?,android,android-asynctask,Android,Android Asynctask,我有一个嵌套的内部类,它扩展了AsyncTask以在后台运行db查询。在post-execute方法中,我调用一个父方法来更新视图,如下所示 private class QueryRunner extends AsyncTask<Void,Void,Cursor> { @Override protected Cursor doInBackground(Void... voids) { return getContentResolver().query(Lead

我有一个嵌套的内部类,它扩展了AsyncTask以在后台运行db查询。在post-execute方法中,我调用一个父方法来更新视图,如下所示

private class QueryRunner extends AsyncTask<Void,Void,Cursor> {

  @Override
  protected Cursor doInBackground(Void... voids)
  {
     return getContentResolver().query(LeadContentProvider.buildUri(app.getEntityId()),new String[]{LeadContentProvider._ID},null,null,LeadContentProvider.LEAD_STATUS_DATETIME +" desc");
  }

  @Override
  protected void onPostExecute(Cursor c)
  {
     onCursorLoaded(c);
  }
}
大多数情况下,这一切正常-但有些用户因此堆栈跟踪而崩溃:

java.lang.IllegalStateException: Must be called from main thread of process
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1392)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:344)
at com.servicemagic.pros.activities.LeadDetails.onCursorLoaded(LeadDetails.java:205)
at com.servicemagic.pros.activities.LeadDetails.access$200(LeadDetails.java:25)
at com.servicemagic.pros.activities.LeadDetails$QueryRunner.onPostExecute(LeadDetails.java:196)
at com.servicemagic.pros.activities.LeadDetails$QueryRunner.onPostExecute(LeadDetails.java:170)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.os.HandlerThread.run(HandlerThread.java:60)

那么-为什么没有在主线程上调用postExecute()方法呢?

没有通过onStart()。如果需要在活动开始时执行此操作,请将其放入onResume()。您总是要执行onResume()。

我相信@hovanesyan的意思是,假设异步任务启动时与之对话的片段可能与它完成执行时的实例不同,这是不安全的。在AsyncTask运行时,Android可能会暂停甚至终止片段。这就解释了为什么问题是间歇性的。只有当用户的片段被暂停或销毁并重新创建时,才会发生这种情况


讨论了这个问题。如果您阅读了文章中的第2项和第3项,您将看到如何解决它。作为片段生命周期的一部分,您负责保存和恢复状态。请参阅的android文档。

如何定义扩展AsynkTask的内部类?你能显示代码吗?用完整的AsycTask代码更新顶部的代码块。我指的是整个层次结构-父类+内部类定义。父类是活动吗?父类从兼容库中的FragmentActivity扩展而来。@harmanjd use
super.onPostExecute(null)
在您的
onPostExecute()
方法中,我看不出这与我的问题有什么关系。感谢您提供这篇文章的链接。我想我更了解现在可能发生的事情——但让我在这里陈述以确保。在以下活动生命周期中:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()。如果在onCreate()或更高版本中创建异步任务,并且活动通过onPause()暂停,则再次调用onResume()时,它将位于主线程上,但不一定是最初用于创建活动的主线程。在这种情况下,当AsyncTask完成时,它的onPostExecute()方法可能会显示此行为。通过使用本文中提到的模式,这不会发生,因为当活动暂停时,它会阻止回调发生,直到在新线程上下文中运行的活动恢复。那是你的理解吗?是的,那是我的理解。复杂,嗯?是的,有点复杂。无论如何-根据你在这里的提示和链接,我改变了使用LoaderManager和CursorLoader的方法。LoaderManager负责此生命周期并管理何时正确交付结果,我避免了问题中描述的问题。我以前没有这样做过,因为对于这个特定的活动,如果db发生了变化,我不希望光标重新加载。但是我对游标加载程序进行了子类化,以避免注册内容观察者。
java.lang.IllegalStateException: Must be called from main thread of process
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1392)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:344)
at com.servicemagic.pros.activities.LeadDetails.onCursorLoaded(LeadDetails.java:205)
at com.servicemagic.pros.activities.LeadDetails.access$200(LeadDetails.java:25)
at com.servicemagic.pros.activities.LeadDetails$QueryRunner.onPostExecute(LeadDetails.java:196)
at com.servicemagic.pros.activities.LeadDetails$QueryRunner.onPostExecute(LeadDetails.java:170)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.os.HandlerThread.run(HandlerThread.java:60)