0

次の問題を解決しようとしています: データ モデルを共有する複数のアクティビティを持つアプリケーションを作成しています。アプリケーションの起動時にデータが DB からフェッチされ、次のように Application クラス拡張にグローバル変数として保存されます。

class MyApp extends Application {

  private MyData myData;

  public MyData getData(){
    return myData;
  }
  public void setData(MyData d){
    myData = d;
    sendBroadcast(new Intent("DATA_UPDATED"););
  }
}

AndroidManifest.xml はもちろん更新され、すべてがうまく機能します。すべてのアクティビティはデータを読み取って更新でき、他のアクティビティは BroadcasrReceiver を使用してデータ変更の通知を取得できます。メイン (GUI) スレッドを更新する必要がある別のスレッドがあると、問題が発生します。db から新しいデータを受信したときにコールバックを含むサービスがあります。コールバックは新しいスレッドで実行されているため、アプリケーション データ モデルの更新はメイン スレッドで行う必要があります。そのために、次のようにハンドラーを使用しました。

public void ServiceCallback(...newData) {           
    //Pass the message up to our handler to make the update on the main thread.
    Message receipt = Message.obtain(mHandler, 0, newData);
    receipt.sendToTarget();       
}

    //Handle incoming message from remote on the main thread (GUI thread)
    private Handler mHandler = new Handler() 
{
     @Override
     public void handleMessage(Message msg) 
     {
    //read new data from the message - from msg.obj field, no prob.             
    //but - how can i get to my application model instance????
     }
};

そのため、メッセージで new_data を渡したのとまったく同じように渡しましたが、この投稿で見ました

それはメモリリークにつながる可能性があります...?それが本当かどうか、そしてその理由がわかりませんでした。誰かが提案できる別の解決策があるかもしれません。とても感謝しております。スレッド間でブロードキャスト レシーバを使用することは可能ですか? 多分これは私の解決策ですか?

4

1 に答える 1

1

正確に何をしようとしているのかは少し不明です。注意すべき点がいくつかあります。共有/グローバル データにアプリケーション オブジェクトを使用しても、実際には何も得られません。単純にシングルトンを使用できます。を使用する場合はApplication、静的getInstance()メソッドを追加できます。定義上シングルトンであるインスタンスが 1 つしかないため、メソッドを追加すると、非アクティビティ クラスからのアクセスが簡単になります。Applicationメインスレッドでクラスのデータを更新する必要はありません。UI を扱っているときは、メイン スレッドでのみ実行する必要があります。

さらに、単純に別のスレッドにメッセージを送信したい場合は、aHandlerで十分です。関与する必要はありませんBroadcastReceivers

于 2012-05-24T14:43:20.127 に答える