从android中的处理程序获取Application实例

时间:2012-05-24 14:36:09

标签: android multithreading

我正在尝试解决以下问题: 我正在编写一个具有多个共享数据模型的活动的应用程序。 应用程序启动时从数据库中提取数据,并在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)线程的线程时,事情就会出现问题: 我有一个服务,包含从数据库收到新数据时的回调。回调正在新线程上运行,因此必须在主线程上更新我的Apllication数据模型。 因为我使用了处理程序如下:

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而传递了它,但是我看到了in this post

它可能导致内存泄漏......?我不明白它是真的和为什么,也许我有另一个解决方案,任何人都可以建议?我真的很感激。是否可以在线程之间使用广播接收器?也许这是我的解决方案?

1 个答案:

答案 0 :(得分:1)

有点不清楚你究竟想要做什么。需要注意的一点是:使用共享/全局数据的应用程序对象并不能真正为您带来任何好处。你可以简单地使用单身人士。如果你想使用Application,你可以为它添加一个静态getInstance()方法,因为根据定义只有一个实例是单例,添加方法只会让它更容易访问非活动类。您不必更新主线程上的Application类中的数据。在处理UI时,您只需要在主线程上执行操作。

此外,如果您只是想将消息发送到另一个线程,Handler就足够了。没有必要涉及BroadcastReceivers