我有一个嵌套的内部类,它扩展了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);
}
}
onCursorLoaded方法的样子如下:
private void onCursorLoaded(Cursor c)
{
mPagerAdapter = new LeadDetailsFragmentPagerAdaper(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
mPager.setCurrentItem(iIndex, false);
}
大多数情况下,这个方法可以正常工作 - 但是有些用户会遇到以下崩溃问题:
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()方法没有在主线程上调用呢?
onPostExecute()
方法中使用super.onPostExecute(null);
。 - ρяσѕρєя K