1

メインアクティビティにSimpleCursorAdapterとListがあります。データベースにアイテムが存在しない場合に表示されるようにemptyViewを設定しました。ただし、AsyncTaskは、onResumeに対して毎回新しいリストを作成します。そのため、リストが読み込まれる前に、空のビュー画面が数秒間表示されます。データクエリは別のスレッドで実行する必要があるため、AsyncTaskが必要です。しかし、emptyViewが毎回ポップアップするのは好きではありません。以下にAsyncTaskメソッドとonResumeメソッドを添付しました。両方ともコンパイル中です。どうすればいいですか?

class GetItems extends AsyncTask<Object, Void, Cursor> {
    DbHelper dbHelper = new DbHelper (MainActivity.this);

    @Override
    protected Cursor doInBackground(Object... params) {
        dbHelper.open();
        return dbHelper.getAllItems();
    }

    @Override
    protected void onPostExecute(Cursor result) {
        adapter.changeCursor(result);
        dbHelper.close();
    }

}

@Override
protected void onResume() {
    super.onResume();
    new GetItems().execute((Object[]) null);

}
4

2 に答える 2

0

この問題は、AsyncTask を起動してonResume終了すると、AyncTask が終了するのを待っている間、ビューが空白になるスレッドの問題のようです。

頭に浮かぶ 1 つの修正方法は、AsyncTask をアクティビティ ライフサイクルの早い段階で起動することです (onCreate または onStart メソッドなど)。これにより、最初の読み込みに間に合うように結果が得られる可能性があります。

その後、取得した結果を保存できます。ユーザーが移動しただけでアクティビティが破棄されずに戻ってきた場合は、古いリストをロードし、AsyncTask を使用して更新されたリストを取得したら、それを更新できます。

編集 もう 1 つの簡単な修正方法は、進行状況ダイアログをAsyncTask のメソッドonPreonPostExecuteメソッドに配置することです。これにより、結果が取得されるまで UI スレッドがブロックされますが、進行状況ダイアログの点滅は、空白の画面よりも耳障りになる可能性があります。

于 2013-01-18T09:44:43.457 に答える
0

を使用する場合は、タスクの開始時にListFragment呼び出すことができますsetListShown(false)。これにより、読み込み中のスピナーが表示されます。タスクの終了時に を呼び出しsetListShown(true)、次に を呼び出しsetEmptyText()て、タスクの結果に応じてエラー メッセージまたは空のメッセージを配置します。

または単純なスイッチの可視性:

class GetItems extends AsyncTask<Object, Void, Cursor> {
    DbHelper dbHelper = new DbHelper (MainActivity.this);

    @Override
    protected void onPreExecute() {
        myListView.setVisibility(View.GONE)
    }

    @Override
    protected Cursor doInBackground(Object... params) {
        dbHelper.open();
        return dbHelper.getAllItems();
    }

    @Override
    protected void onPostExecute(Cursor result) {
        adapter.changeCursor(result);
        myListView.setVisibility(View.VISIBLE);
        dbHelper.close();
    }

}

@Override
protected void onResume() {
    super.onResume();
    new GetItems().execute((Object[]) null);

}
于 2013-01-18T09:42:03.963 に答える