わかりました、私はしばらくの間、この問題を解決するための最善の方法を研究してきました.
ニーズ:
- アクティビティ [SendMsg] は、最大 5 MB の画像の添付ファイルを含むメッセージ本文を構成します。
- ユーザーがこのメッセージを送信したら、メッセージをサーバーにアップロードする必要があります
- このアップロードは、完了するか失敗するまでユーザーがアプリを使用できないようにするという意味で、同期的に行う必要があります
- 完了すると、送信が成功した場合は SendMsg アクティビティが破棄されます。それ以外の場合は、エラー ダイアログが表示されます。
- アップロードとユーザー エクスペリエンスは、電話のローテーションやホーム ボタンの押下/通話などを考慮して持続する必要があります。
ここでの最後の箇条書きが最も難しいことが判明しました。
調査結果:
静的な AsyncTask で作業を行うことだけを考えましたが、それがうまくいくとは思いません-状態が非常に乱雑になり、アプリがバックグラウンドにあるときにOSがスレッドを強制終了しないという保証がないようです.
私は、サービスが作成され、アクティビティからバインド/アンバインドされるサービスを使用することにしました。サービスは AsyncTask を生成し、作業を実行してから、その結果 (成功/失敗) に従ってアクティビティに通知します。このパラダイムは、私の大きなメッセージを除いてうまく機能しているようです。Service/Activity 通信 Message 通信は、このような大きなペイロードをマーシャリングするためのものではありません。*注意: 不明な場合は、ユーザーが [送信] をクリックしたときに、このフォーム データとファイルをサービスで利用できるようにする必要があります。場合によっては、これはカメラから取得した画像であり、アプリの目的でディスク上に存在することも、存在することもできません。
明らかに、ここで必要なのは、アクティビティからデータを保存できるある種の共有メモリ ストアです。その後、Activity は Service に、そのデータをアップロードできることを知らせることができます。
そのような共有領域はメモリ内に存在できますか? Service から Application オブジェクトを取得して、そこにデータを保存できますか?
もう1つの問題は、アップロードが終了したときに発生しますが、アクティビティがサービスにバインドされていませんが、これを理解した可能性があると思います. 次の意味があるかどうか教えてください。
- サービスはアップロードを終了します
- アクティビティが現在バインドされているかどうかを確認するサービス
- はいの場合、アクティビティがメッセージ キューを介して処理するエラー メッセージを返します
- いいえの場合は、その共有メモリ領域に戻りコードを保存し、そこにもブール値のフラグを立てます
- クライアント アクティビティが作成/再開されるときは、最初に常にこのブール値をチェックして、プロセスが既に完了しているかどうかを確認する必要があります。その場合は、メッセージを独自のハンドラーにディスパッチし、以前と同じようにコードを処理します