【问题标题】:getting Application instance from a handler in android从android中的处理程序获取应用程序实例
【发布时间】:2012-05-24 22:43:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: android multithreading


    【解决方案1】:

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

    此外,如果您只是想向另一个线程发送消息,Handler 就足够了。无需涉及BroadcastReceivers

    【讨论】:

    • 感谢您的回复。实际上我的第一个实现是简单的单例,但是当我的应用程序在后台运行一段时间时我遇到了一个错误,单例被删除了,所以我得到了空引用。这就是我转向 Application 类的原因。
    • 如果你的进程被杀死,单例中的数据自然会丢失。但 Application 类也是如此。除了有一个可以初始化东西的onCreate() 方法之外,它并没有什么特别之处。您可以使用延迟初始化数据的单例实现同样的目的。
    • 我的进程没有被杀死 - 服务仍在运行,但无法从单例读取数据。由于某种我无法理解的原因,单身人士的内存被清除了,但如果我使用 Application 类,它可能会起作用。这个问题要了我的命:(
    • 没有其他理由从单例中清除内存。您的服务将重新启动(在一个新进程中),但 Android 不知道您的单例并且无法重新初始化它。这就是为什么它是“空的”。
    • 所以只有当我将应用程序放在前面时才会出现问题?
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2019-01-04
    • 2017-04-20
    • 2015-02-23
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多