如何在使用回调时处理LifeCycle问题

时间:2017-12-21 10:23:13

标签: android

我的应用经常使用以下模式:

  • 用户点击按钮
  • 触发API请求
  • 解析
  • 响应
  • 回调返回数据数据在视图中更新。

但是,由于API的性质,这些回调可能需要一些时间,如果我以高速度浏览应用程序,我发现我很容易崩溃应用程序。大多数情况下,这是由与活动和/或片段不再存在相关的NullPointerExceptions引起的。我的问题是在处理这些问题时最佳做法是什么。我应该到处检查空值吗?我已经在某个地方读到你应该避免使用回调来更新用户界面,但我不确定替代方案是什么。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

对于Fragment,您可以isAdded()

进行检查
 public void onResponse(){
    if(isAdded()){
        // Do your stuff here
    }
}

活动isFinishing()

public void onResponse(){
    if(!isFinishing()){
        // Do your stuff here
    }
}

答案 1 :(得分:1)

让我分享一下我在其中一个应用中的表现。

  • 我创建了一个扩展Application的类,该类负责启动数据库。它是Singleton Static数据库,每当我需要做某事时,我都会调用db.getInstance().doSomething()

  • 当调用任何API方法时,我启动一个AssyncTask,它在完成后将数据存储在数据库中(如果失败,则不保存任何内容)。

  • 更新数据库时,会发送LocalBroadcast。您可以发送广播来通知错误(例如,停止刷新动画并显示错误消息)。

  • 每个活动都有一个BroadcastReceiver,可以注册接收数据库发送的本地广播。我在onStart()期间注册并在onStop()期间取消注册。每个活动都会注册到适当的事件(因为您可以创建多个意图和操作...这样,您的活动只会收到所需的意图,而不是每次广播您的应用。

  • 这样,当活动打开时,它会检查数据库中的数据,如果有任何内容更改,它会收到广播通知并采取适当的操作。

  • 当活动关闭时,它不再接收广播。但是,下载完成后,更新的数据将存在于数据库中。

  • 您必须处理已启动某些API调用以避免调用两次的情况(至少在第一次调用相同方法完成之前等等)。

您还可以使用ContentObserver来监控某些数据库等。

这是一种处理方式。它可能适用于你的情况等...只是分享,因为它可能会帮助你