2

インテントとアプリケーションのコンテキストに関する一般的なアドバイスを探しています。

スレッド化されたネットワーク リスナーのようなものを実行したり、位置情報を収集したりするサービスを備えたアプリケーションがあり、メインのアクティビティと構造化されたセットで共有される場合、メインのアクティビティはユーザー入力で上記のデータを調整する必要があります。これらのレベル間でこのデータを共有する最もスマートな方法は?

現在、Intents を使用してセットアップを行っていますが、今のところそうなるかもしれませんが、好きではありません。データ全体をシリアル化することはできないため、あちこちにビットをブロードキャストしています。主な問題は、インテントが更新に使用されるプライマリ データ セットがメイン アクティビティに格納されていることです。

データ セットをサービスに移動するか、アプリケーション コンテキストに保存したいと考えています。ただし、メインのアクティビティがデータを調整することがあるため、スレッドの安全性が心配です。たとえば、シングルプレス、ブール値の変更、データセットからのアイテムの削除など...

インテントのポイントはわかりますが、アプリケーションの周りのデータ (部分データ) をシャッフルするための手段としてではなく、アプリケーション コンテキストに格納されたデータを必要とする関数のトリガーとしてインテントをブロードキャストしたいと思います。

アプリケーション コンテキストを合理的に使用して、サービスとアクティビティの間で安全な方法でデータを更新および共有できますか? サービスをバックグラウンドで実行し、ユーザーがアプリに戻ったとき、または方向を変更したときに、アクティビティがデータ セットをプルまたは更新するようにしたいと考えています。ありがとう。

更新/明確化

これはどう。データ共有のためにバインドされたサービス getter/setter メソッドにアクセスするのは安全ですか? サービスにバインドして、パブリック メソッドを介してスレッド化された関数を開始/停止します (これに戻ってバインドしていることに気付いてからしばらく経ちました)。この方法で getter/setter を安全に呼び出すことができますか?

4

2 に答える 2

0

独自のソリューションを作成しようとするのではなく、MVC モデルについて考えることをお勧めします。

2 つの [コントローラ] (アクティビティ、フラグメントなど) 間でデータを渡す必要がある場合は、データを (デ) シリアル化できるように実装されている [M]モデルに永続化する必要があります。

SQlite (または一部の ORM)、SharedPreferences、ファイル ストレージ (シリアル化された json の可能性あり)、ファイル内のバイナリ BLOB ( 、 を参照) ObjectOutputStreamObjectInputStreamまたは別の [M]model 実装を使用するかどうかは、カスタム ユース ケースに完全に依存します。

システムとユーザーがアプリケーションでどのように機能するかという理由で、データをコンテキストに静的に保存することは一般的に非常に厄介な考えです

スタンドアロン スレッドを作成してデータを取得し、[M]モデルに永続化するなど、さらにいくつかの使用例について考えてみてください。[M]モデルが何らかの静的変数またはアプリケーション コンテキスト変数である場合、常にそれに固執し、同期、待機/結合/通知などの混乱を処理する必要があります。[M]モデルの場合スタンドアロンの SQL (または noSQL) データベースになるため、オブザーバーを使用して [モデル] の変更について通知することができ、コンテキストはまったく必要ありません。

からわかるようにandroid.os.NetworkOnMainThreadException、データを扱う作業はすべて非同期にする必要があります。データがオンライン、ローカル データベース、ファイル システム、またはコンテキストに保存されているかどうかは関係ありません。この知識に固執し、独自の解決策を考え出してください。

于 2013-04-24T19:16:31.337 に答える
0

アクティビティとサービスを通信するには、ResultReceiver または LocalBroadcast をデプロイできます。Service は重い作業を行い、言及されたメソッドを介して結果を送信することにより、Activity と対話することができます。アクティビティのライフサイクルの onStart および onStop メソッドでアクティビティをサービスに接続して、アクティビティがフォアグラウンドにあるかどうか、またはそれに応じて UI を更新しないかどうかを判断できます。

それが役に立てば幸い。

注: 私の個人的な経験では、私は両方と仕事をしてきましたが、彼らは素晴らしい仕事をしています. アクティビティが複雑になるため、サービスへのバインドはお勧めしません。

于 2013-04-24T21:03:01.633 に答える