Android aSyncTask并开始另一项活动

时间:2011-09-27 06:29:37

标签: android android-activity android-asynctask

我将这个内部类作为应用程序的一部分,它不接受方向的变化(在横向方向上更有意义)。

  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

2 个答案:

答案 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然后启动另一个活动可能对你有用。