1

ボタンがあります。ユーザーがクリックすると、UI全体(テキストビュー、グラフ)が更新されます。UI のコンテンツは SQLite データベースから取得されます。更新関数に loading() という名前を付けました。ご想像のとおり、loading() の内部には、多くのデータベース操作と UI の更新があります。データのサイズが大きくなると、このloading()が行われる時間が長くなるため、ボタンが押されたままの時間が長くなります。

この状況に対処するためにasynctaskを使用して、ボタンがフリーズする代わりにprogressdialogが出るようにしようとしましたが、doinbackground()は宣言されているUIコンポーネントに触れることができないため、asynctaskのdoinbackground ()にloading()メソッドを配置できませんそのアクティビティの onCreate() メソッドから。

loading() 関数を書き直したくありません。

そうする他の方法はありますか?? 助けてください。できれば、いくつかの例を挙げてください。感謝します。

4

5 に答える 5

3

メイン アプリケーション スレッド (別名、UI スレッド) で時間のかかるタスクを実行すると、UI が応答しなくなり、最終的に有名なApplication Not Responding (ANR) ダイアログが表示されます。

推奨される方法は、これらを AsyncTask で実行し、 を呼び出すpublishProgress()ことですdoInBackground()。UI 更新ロジックonProgressUpdate()AsyncTask. onProgressUpdate()を呼び出した後、メイン アプリケーション スレッドで自動的に呼び出されますpublishProgress()

于 2012-10-02T15:33:28.997 に答える
1

私の意見では、この仕事をするために AsyncTask を使用するのが最良の選択肢です。必要に応じて、loadInBackground から進行状況の更新をトリガーして、UI の更新を取得できます (publishProgress()タスクのバックグラウンド スレッドから呼び出すonProgressUpdate()と、UI スレッドでメソッドが呼び出されます)。

その他のオプション: ジョブを別のスレッドまたはバックグラウンド サービスで実行します。次に、UI から、ハンドラーを使用して X ミリ秒ごとに更新をトリガーできます。

于 2012-10-02T15:35:10.723 に答える
1

このインスタンスで AsyncTask を使用するには、データを doInBackGround() にロードし、何らかのデータ構造またはモデル オブジェクトに結果を入力します。それを doInBackground() の結果として返します。

onPostExecute()は UI スレッドで実行され、結果を使用してコンポーネントにデータを入力および更新できます。

于 2012-10-02T15:33:39.037 に答える
-1

を使用して、UI スレッドで実行できますrunOnUiThread(Runnable)Threadとを組み合わせて使用​​することもできますHandler

于 2012-10-02T15:31:05.753 に答える
-2

私はHandler現在 s について学んでおり、ドキュメントによると、データにアクセスするために現在推奨されている方法です。おっしゃるとおり、UI スレッド以外の別のスレッドから UI コンポーネントにアクセスすることはできません。これは、データをロードするコードから UI を更新するコードを分離する必要があるHandler独自のコードを使用するかロールするかを意味します。AsyncTask

于 2012-10-02T15:35:16.557 に答える