0

私は大きな問題を抱えています.これはコードです:

private class ViewDataTableTask extends AsyncTask<Void, Void, String> {
    ...

    protected String doInBackground(Void... params) {

        Cursor listCursor = db.rawQuery("SELECT ..." , null);
        ListView table_body = new ListView(context);

        try{
            table_body.setAdapter(new MyAdapter(context , listCursor));
        }finally{
             if(listCursor != null){
             listCursor.close();
        }
        ...
   }
   ...
}

MyAdapter はandメソッドCursorAdapterを使用するカスタムですgetView()newView()

前のコードを実行すると、次のエラーが発生します。

java.lang.IllegalStateException: attempt to re-open 
an already-closed object: android.database.sqlite.SQLiteQuery

メソッドがUIスレッドで実行されgetView()ているようです !!!!!!!!newView()

質問は簡単です: どこに置く必要がありcursor.close()ますか? CursorLoader や startManagingCursor(..) を使用したくない

私を助けてください!!!

4

3 に答える 3

0

でやってくださいonPostExcute()

doInBackground()ワーカースレッドです。

とは実行されonPreXecute()ますonPostExcute()UIThread.

あなたのコードでは を使用しているため、メソッドcontext内では無効になる可能性があります。doInBackground()

だからそれをするonPostExcute()

于 2012-10-26T10:41:29.207 に答える
0

取得したCursorインスタンスはCursorAdapter、ユーザーが listView を使用している限り使用されます。そのため、カーソルを早く閉じるべきではありません。Activity のインスタンスが破棄されようとしているときはいつでも、そのカーソルを閉じます。または、そのカーソルを変更するたびに (これがアプリの場合) CursorAdapter、以前に使用したを閉じます。

そして、他の人が言うように、カーソルをCursorAdapterUI スレッドにリセットします ( AsyncTask.onPostExecute())。

于 2012-10-26T10:48:06.897 に答える
0

asynctask を入れる必要がありますか? あなたがUIを更新しているように私には思えますか?

また、最良の結果を得るために、カーソルをできるだけ制限するようにしてください。開く、情報を取得する、新しい変数に情報を入れる、閉じる。

于 2012-10-26T10:30:20.937 に答える