8

一部のAndroidアクティビティとAndroidサービスの間で使用されるシングルトンを作成するのは悪い考えではないかと思います。私の知る限り、静的フィールド(私の場合はシングルトン)は、プロセス全体が生きている限り利用できます。

私の計画では、Parcelableの代わりにシングルトンを使用して、アクティビティとバックグラウンドサービスの間でデータを共有することです。したがって、私のActivity1は、MySingleton.getInstance()。addData(foo);を呼び出してデータを追加します。次に、新しいデータがシングルトンに追加されたことをサービスに通知するインテントを送信しました。次に、BackgroundServiceがインテントを処理し、MySingleton.getInstance()。getLatestData();を呼び出します。次に、データを処理します(時間がかかります)。次に、サービスの結果は、シングルトンを使用して「ポスト」バックされ、ブロードキャストインテントを起動します。これは、Activity1(生きている場合)によって処理され、Activity1はシングルトンから結果を取得します。

それは悪い考えだと思いますか?

編集:私が実装したいのは、Webサーバーからデータをダウンロードして解析し、結果を返すソフトウェアの平和です。したがって、私のアクティビティはDownloadJobオブジェクトを作成します。DownloadJob-Objectは、すべてのDownloadJobをキューに入れて管理するDownloadScheduler(シングルトン)に配置されます。DownloadSchedulerを使用すると、5つのDownloadJobを同時に実行し、キューを使用して待機を保存できます。効果的なダウンロードは、DownloadService(IntentService)によって実行されます。これは、新しいDownloadJobを今すぐ実行(ダウンロード)する必要があることをIntentを介して通知されます。DowanlodServiceは、DownloadSchedulersキュー(PriorityBlockingQueue)から次のジョブを取得し、DownloadJob.setResult(...)を設定して結果を返し、結果の準備ができたことを示すブロードキャストインテントを起動します。

したがって、私のシナリオでは、DownloadJobをパーセル可能にして、Intentで渡す代わりに、シングルトンを使用してDownloadServiceからDownloadJobsにアクセスします。したがって、メモリに2つのDownloadJobがあるという問題を回避します(1つは「アクティビティサイト」に、もう1つは「サービスサイト」にあります)。

これをよりよく解決する方法の提案はありますか?

DownloadScheduler(Singleton)のような静的インスタンスが、低メモリのAndroidシステムによって解放されて使用されるというのは本当ですか?では、アプリケーションをサブクラス化し、そこに参照(非静的)を保持することで、この問題を回避できますか?

4

3 に答える 3

3

別のスレッドで操作を実行していると思われるバックグラウンド サービス間の共有メモリとしてシングルトンを使用している場合、同期の問題が発生したり、一貫性のないデータを読み取ったりする可能性があります

シングルトンのデータが同期されていない場合は、注意が必要です。バックグラウンド スレッドが書き込みを行っている間、誰も読み取っていないことを確認するために「プロトコル」に依存しているためです (エラーが発生する可能性があります)。

一方、同期されている場合、データを読み取るアクティビティがブロックされ、サービスがシングルトンにデータを書き込むのを完了するのを待っている可能性があるため、エラーに直面するリスクがあります。

他の人が言ったように、OS にリソースが必要な場合はシングルトンが解放される可能性があり、データがもう存在しない可能性があることにも留意する必要があります。

ottoeventbusなどのイベント バスを使用したい

編集:

シングルトンをバックグラウンド (インテント) サービスのエントリ ポイントとして使用することは、 Android 用のレスト クライアント アプリケーションの構築に関する2010 年の Virgil Dobjanschi の講演で提案されたアプローチです。

推奨されるアプローチは、進行中のリクエストのコントローラーとして機能するシングルトンを持つことです。インテント サービスへのリクエストは既に OS によってキューに入れられていることも考慮してください。そのため、インテント サービスによって順次処理される複数のインテントをスローできます。

しばらく前に、それをライブラリの出発点として試してみましたが、これはまだ未完成のままです。ここでソースを見つけることができます

私が絶対にしないことは、データをシングルトンに保存することです。私が好むアプローチは、データを永続的なストレージ (SQL / 設定 / ファイル / コンテンツ プロバイダーなど) に保存し、クライアントにブロードキャスト メッセージを介して (または、コンテンツ プロバイダーを使用している場合は、オブザーバー)。

最後に、ある程度これはrobospiceライブラリが従うアプローチであり、かなり成熟しているように見え、キャッシングなどの多くの興味深い機能を出荷しています。

于 2012-11-23T03:47:42.040 に答える
1

より良いアイデアは、 Application をサブクラス化し、そこに長期的なオブジェクトを配置することです。Application をサブクラス化することで、アプリケーションの起動とシャットダウンを適切に処理できますが、これはシングルトンでは簡単に行うことができません。また、アプリケーション アクティビティとサービスを使用することで、parcelables に頼ることなく、プログラム内のモデルへのアクセスを共有できます。また、シングルトンがプログラムにもたらす問題をすべて回避できます。

また、大量のデータをそこに押し込むためだけに大量の定型コードを必要とするデータベースにすべてを格納することに頼る必要もありません。アプリケーションの部分間で動作を共有することは何もせず、コミュニケーションや活動の集中化を促進することも何もしません。シャットダウン間で状態を維持する必要がある場合は、それを使用してください。そうでない場合は、多くの作業を節約できます。

アクティビティやサービスに共有モデルを挿入するRoboguiceのようなものを使用することも検討できます。

これが役に立つかもしれません:

Android開発におけるデザインパターンの原則とは?

于 2012-11-23T03:38:40.060 に答える
0

このようなシングルトンを使用することは必ずしも悪い考えではありませんが、Android がプロセスを停止することを決定した場合、その状態は失われます。代わりに、SQLite データベースまたは永続的なキューに状態を保存することを検討することをお勧めします (良い例としてテープを見てください)。

于 2012-11-23T03:38:11.907 に答える