我将这个内部类作为应用程序的一部分,它不接受方向的变化(在横向方向上更有意义)。
private class initialDBQuery extends AsyncTask<SQLiteDatabase, Void, Cursor> {
@Override
protected Cursor doInBackground(SQLiteDatabase... params) {
final SQLiteDatabase mDatabase = params[0];
mCursor = mDatabase.rawQuery("SELECT * FROM database", null);
return mCursor;
}
@Override
protected void onPostExecute(Cursor c){
ParentActivity.this.mCursor = mCursor;
ParentActivity.this.updateQuery();
mDatabase.close(); //Close database connection ASAP
}
// can use UI thread here
protected void onPreExecute() {
ParentActivity.this.mAnimalPager = null;
Toast.makeText(ParentActivity.this.getBaseContext(), "Loading Database...", Toast.LENGTH_SHORT).show();
}
}
我的主UI有许多按钮,这些按钮会导致不同的活动,其功能是通过对主要活动(ParentActivity)的意图提供搜索条件,然后执行搜索。主要活动的其余部分是一个viewpager,它取决于从AsyncTask返回的游标(此更新工作正常)。
我的问题是:使用此代码我,在asynctask运行时按下其中一个屏幕按钮(启动另一个活动),然后我收到错误“无法暂停活动”。
当应用程序暂停时,我需要采取哪些进一步的步骤来处理AsyncTask的运行?
谢谢,m
答案 0 :(得分:1)
我在这里遇到的问题实际上与我在主要活动上的viewpager有关。
当AsyncTask为PagerAdapter创建游标时,我没有设置适配器,直到它完成。当尚未设置适配器时,ViewPagers和activity onPause存在已知问题(请参阅here)。
为了解决这个问题,我修改了我的适配器,当适配器没有可用的游标时返回0:
public int getCount() {
// return the size of the cursor if it has been instantiated;
return (mCursor !=null) ? mCursor.getCount() : 0 ;
}
并向适配器添加了setCurrentCursor方法。这样我就可以设置适配器并将其绑定到onCreate中的viewpager,然后在从ASyncTask获取时将游标添加到适配器;
public void setCurrentCursor(Cursor cu){
this.mCursor = cu;
this.notifyDataSetChanged();
}
现在我要做的就是在传递创建的游标的ASyncTask的onPostExecute方法中调用adapter.setCurrentCursor。
希望这会有所帮助。
谢谢, 米
答案 1 :(得分:0)
首先尝试取消asynctask然后启动另一个活动可能对你有用。