2

AsyncTaskデータベースからアイテムをより効率的に受け取るために、アプリのフラグメントにを追加することにしました。

ジェネリックをVoid, Void, List<Object>(Object作成したオブジェクトはどこにあるのか) に設定し、内部メソッドは次のように設定します。

private class GetObjectsTask extends AsyncTask<Void, Void, List<Object>> {

    @Override
    protected List<Object> doInBackground(Void... params) {
        SQLiteDatabase db = mDbHelper.getInstance(getActivity().getApplicationContext()).getReadableDatabase();

        String[] projection = {
                .........
        };

        String sortOrder = ...;

        Cursor c = db.query(TABLE_NAME, projection, null, null, null, null, sortOrder);

        while(c.moveToNext()) {
            long itemId = ...;
            String title = ...;
            long startMil = ...;
            long endMil = ...;

            mList.add(new Object(itemId, title, new Date(startMil), new Date(endMil), null, null));
        }

        db.close();
        return mList;
    }
}

同じフラグメントからタスクを呼び出す方法は次のとおりです。
new GetObjectsTask().execute((Void[]) null);

タスクの実行後、配列の項目を表示するようにリスト ビューを設定しました。
以前はまったく同じコードがタスクなしで使用されていたため、動作するはずです。問題は、そうではないということです。 mListこの内部タスク クラスを保持しているフラグメントで定義されているため、動作することを期待していました。

このような動作の原因は何ですか?
また、返されたアイテムも表示するようにタスクをリスト ビューに設定することは可能でしょうか (推奨されますか)。(オーバーライドすることによりonPostExecute(Result))

ありがとうございました!

4

1 に答える 1

5

onPostExecute(Result) はまさに、リストビューを初期化してアダプタを設定する場所です。原因 onPostExecute() がメイン UI スレッドで実行されています。

于 2013-08-09T21:27:46.560 に答える