0

我正在尝试解决以下问题:我正在编写一个具有多个共享数据模型的活动的应用程序。应用程序启动时从数据库中获取数据并保存为应用程序类扩展中的全局变量,如下所示:

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)线程的线程时,事情就会出现问题:我有一个服务,其中包含从数据库接收到新数据时的回调。回调在新线程上运行,因此更新我的应用程序数据模型必须在主线程上完成。为此,我使用了如下处理程序:

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()方法,因为只有一个实例,根据定义它是一个单例,添加该方法只会让非活动类更容易访问。您不必Application在主线程的类中更新数据。当你处理 UI 时,你只需要在主线程上做一些事情。

此外,如果您只是想向另一个线程发送消息,aHandler就足够了。没有必要参与BroadcastReceivers

于 2012-05-24T14:43:20.127 回答