0

HashMap を作成してアダプターを作成し、ListView に入力する非同期タスクがあります。doInBackground メソッド中に表示される進行状況ダイアログがあります。onPostExecute() メソッドでは、進行状況ダイアログを閉じて、リストビューに doInBackground メソッドに保存された項目のリストを設定するメソッドを呼び出します。

これはうまくいきます。しかし、私は奇妙なことに気づきました:

私が見る問題は、進行状況ダイアログが (onPostExecute で) 閉じられようとしているときに画面をロックすると、空でないアイテムが含まれていてもリストビューが表示されないことです。logcat メッセージとデバッグ時に確認しました。

画面ロック (電源ボタンを 1 回押す) が UI スレッドをブロックしている可能性はありますか? この問題を解決し、ListView に項目が表示されるようにするにはどうすればよいですか?

onResume() のコード:

@Override
protected void onResume(){
    super.onResume();
    if(MyAdapter !=null){
        pull_listView.setAdapter(MyAdapter);//pull_listView is listview
        MyAdapter.notifyDataSetChanged();//MyAdapter is the adapter

    }
}
4

2 に答える 2

1

この状況は、AsyncTask を使用してバックグラウンド処理を行うことの欠点を示しています。場合によっては、特にバックグラウンド作業に時間がかかると思われる場合は、IntentService の方が適している場合があります。AsyncTask はバックグラウンド作業を現在のアクティビティに結び付けますが、IntentService は完全に分離されています。Android トレーニング クラスRunning in a Background Serviceでは、IntentService をセットアップし、作業をリクエストし、作業が完了したときにアクティビティに通知する方法を示します。IntentService から Activity へのデータの受け渡しはもう少し複雑ですが、オプションがあります。

于 2013-03-11T23:52:08.123 に答える
0

onStop()Activity Lifecycleに従って画面が消えると呼び出されます。そこにチェックを入れて、データが入力されているかどうかを確認できoverride onStart()ます。onResume()そうでない場合は、入力します。画面が消えた場合にデータを保存するために、「onStop()」をオーバーライドすることもできます。

編集

この特定の状況では、問題ないと思いますonResume()onStart()、リンクに示されているように表示さonResume()れる前に呼び出されることが保証されているため、通常は最も安全です。Activityどの種類のチェックを使用するかはあなた次第であり、すべてをどのように処理するかによって異なります。ただし、あなたAsyncTaskがクラスの内部クラスである場合は、Activity単純に を作成できますboolean member variable。たとえば、boolean isDone=false;これを true に変更するかdoInBackground()、データがロードされていることを認識します。false の場合は、データの取得を再試行できます。これが理にかなっており、役立つことを願っていますonPostExecute()onResume()

于 2013-03-11T23:30:43.057 に答える