0

これが私が3日間解決しようとしている問題です:

たとえば、REST クライアント アプリは多くのバックグラウンド作業 (ネットワーク呼び出し) を実行し、結果を UI スレッドにポストします。非同期で実行する必要があることは明らかです。Android では、いくつかの方法でこれを行うことができます (AsyncTasks や IntentServices など)。

アクティビティから非同期タスクを実行する際の最大の問題は、構成の変更です。たとえば、AsyncTask でダウンロード プロセスを開始し、ProgressDialog を表示するアクティビティがあります。画面の回転後、アクティビティは OS によって再作成されています。その結果、asynctask が古い (死んでいる) アクティビティの進行状況ダイアログを閉じようとすると、失敗します。

この問題にはいくつかの解決策があります。

  • 最初の 1 つは、ワーカー フラグメントに asynctask を保持することです。それを行う方法についての素晴らしい投稿はこちらです。このソリューションの大きな利点は、OS が onPostExecute() メソッドをいつ呼び出すかを知っていることです。場合によっては、古いアクティビティが破棄され、新しいアクティビティがまだ作成されていないときに、onPostExecute() が呼び出されることがあります。しかし、OS は onAttach() が呼び出される前に onPostExecute() の実行を許可していないため、これは起こりません。短所は、AsyncTasks は長時間の操作には適しておらず、OS のバージョンによって動作が異なることです。

  • 2 番目のアプローチは、LocalBroadcastManager と IntentService を使用することです。これは、それを使用する方法を示す別の投稿です。サービスが登録解除されたとき (アクティビティが再作成された瞬間)、BroadcastReceiver にメッセージを送信するとどうなりますか?

  • 3 番目の解決策はダーティ ハックです。これを mainfest で宣言しますandroid:configChanges="keyboardHidden|orientation"。私にはふさわしくありません。

多分誰かが別の解決策を知っていますか?

4

1 に答える 1