我正在尝试解决以下问题: 我正在编写一个具有多个共享数据模型的活动的应用程序。 应用程序启动时从数据库中提取数据,并在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
它可能导致内存泄漏......?我不明白它是真的和为什么,也许我有另一个解决方案,任何人都可以建议?我真的很感激。是否可以在线程之间使用广播接收器?也许这是我的解决方案?
答案 0 :(得分:1)
有点不清楚你究竟想要做什么。需要注意的一点是:使用共享/全局数据的应用程序对象并不能真正为您带来任何好处。你可以简单地使用单身人士。如果你想使用Application
,你可以为它添加一个静态getInstance()
方法,因为根据定义只有一个实例是单例,添加方法只会让它更容易访问非活动类。您不必更新主线程上的Application
类中的数据。在处理UI时,您只需要在主线程上执行操作。
此外,如果您只是想将消息发送到另一个线程,Handler
就足够了。没有必要涉及BroadcastReceivers
。