2012-11-22 10 views
7

いくつかのAndroidアクティビティとAndroidサービスの間で使用されるシングルトンを作成することは悪い考えでしょうか。私が静的なフィールドを知っている限り、私の場合、Singletonはプロセス全体が生きている限り利用可能です。Android:アクティビティとサービスの間で使用されるシングルトン

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

あなたはそれが悪い考えだと思いますか?

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

私のシナリオでは、DownloadJob Parcelableを作成してIntentで渡す代わりに、DownloadServiceからDownloadJobsにアクセスするシングルトンを使用します。だから、私はメモリ内に2つのDownloadJobを持っている( "活動サイト"と "サービスサイト"の2つ)という問題を回避します。

これを解決する方法を教えてください。

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

+0

はい、Androidでは、あなたのプロセスはいつでも消滅し、データを永続的なストアに保存してから、コンテンツプロバイダをインターフェイスとして書き込むことはできません。 –

+0

私はデータを永続的に保存するためネットしません。私はActivitisがいくつかのオブジェクトを入れ、サービスがそれらを取得して何らかの作業をしてから結果を返すキューを用意するだけです。 – sockeqwe

答えて

0

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

+0

ヒントはありますが、私はオブジェクトを永続化する必要はありません。前の投稿の私の最後の編集を見てください。 – sockeqwe

1

アプリケーションをサブクラス化し、長い生物オブジェクトをそこに配置することをお勧めします。アプリケーションをサブクラス化することで、シングルトンでは簡単に行えないアプリケーションの起動と停止を適切に処理できます。また、アプリケーションアクティビティを使用すると、サービスはパーセルブルに頼らずにプログラム内のモデルへのアクセスを共有できます。シングルトンがあなたのプログラムにもたらすすべての問題を避けることができます。

また、データベースにすべてのボイラープレートコードを格納するだけで、多数のデータを格納する必要がありません。アプリケーションの部分間で振る舞いを共有するための何もしませんし、コミュニケーションやコミュニケーションの集中を促進するための何もしません。あなたが本当にシャットダウンの間に状態を維持する必要がある場合は、それを使用することができますが、そうでない場合は、自分で多くの仕事を節約することができます。

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

あなたは、これが役に立つかもしれません:

what's design pattern principle in the Android development?

+0

サブクラス化アプリケーションは良いです。だからあなたはシングルトンの代わりにサブクラス化されたアプリケーションで "普通の"リファレンスを使うべきだと思いますか? Btw。私は自分の投稿に具体的なシナリオを追加しました。 – sockeqwe

+0

ダウンロードマネージャを構築する場合は、シングルトンを使用しないでください。あなたは本当にシングルトンを使用するべきではありませんが、特にダウンロードマネージャのためには使用しないでください。 1つは、アプリケーションがコールバックを受信するため、Androidがあなたのアプリケーションをシャットダウンする状況に陥った場合、あなたはそれを知るでしょう。このような場合は、バックグラウンドで実行されている各スレッドを適切にシャットダウンして、復元する必要のあるデータをすべて省くことができます。このコードは、アプリケーションに簡単にアクセスできます。MyApplication app =(MyApplication)activity.getApplication()。私はあなたが "普通"の言葉で何を意味するか分かりません。 – chubbsondubs

2

あなたはシングルトン私は別のスレッドで操作を実行していると仮定し、バックグラウンドサービスとの間の共有メモリとしてだけでを使用している場合は、あなたがに実行することが同期の問題、および/または一貫性のないデータの読み取り。

シングルトン内のデータが同期されていない場合は、バックグラウンドスレッドが書き込み中であることを誰も知らないようにするために、「プロトコル」に依存しているため注意が必要です。

一方、同期されていると、データを読み取るアクティビティがブロックされ、データがシングルトンに書き込まれるのを待っているため、エラーに直面する危険性があります。

もう1つは、osにリソースが必要な場合にシングルトンが解放され、データがもう存在しない可能性があることにも留意する必要があります。私はむしろ、このようなotto又はeventbus

EDITとしてイベントバス使用したい

:バックグラウンド(インテント)サービスのエントリポイントとしてシングルトンを使用

アプローチは、約2010バージルDobjanschi talkに示唆されていますアンドロイドのクライアントアプリケーションを構築する。

提案されているアプローチでは、進行中の要求のコントローラとして実行するシングルトンがあります。インテントサービスへのリクエストは、すでにOSによってキューに入れられているので、インテントサービスによって順番に処理される複数のインテントを投げることもできます。

私はまた、まだ未完成のままである図書館の出発点としてそれをとってみました。あなたはソースを見つけることができますhere

私は確かにシングルトンにあなたのデータを格納することです。私が望むアプローチは、永続的なストレージ(sql/preferences/file/contentプロバイダなど)にデータを格納し、クライアントにブロードキャストメッセージによる変更を知らせる方法です(コンテンツプロバイダを使用している場合は、オブザーバー)。

最後に、ある程度まではこれはrobospiceライブラリに続くアプローチです。これはかなり成熟していて、キャッシュなどの興味深い機能がたくさんあります。

+0

こんにちは、あなたの答えに感謝します。私は自分の投稿に具体的なシナリオを追加しました。 EventBusは良い解決策であるようです。 EventBusで経験したことがありますか、あなたは何がより良くなるか(EventBusまたはIntent)を知っていますか? – sockeqwe

+0

私は答えを修正しました。私はevenbusを試したことはありませんでしたが、あなたの説明を与えれば、私はロボスピスに行きます。 – fedepaol

関連する問題