android - 离开并返回 Activity 时,删除处理程序回调将停止工作

标签 android handler runnable

我有一个处理程序和一个可运行程序,可运行程序每 5 秒向屏幕发送一次 toast,代码如下:

Handler handler = new Handler();
Runnable runnable = new Runnable() {

    public void run() {

        Toast.makeText(getApplicationContext(), "DISPLAY MESSAGE" + walking, Toast.LENGTH_SHORT).show();
        handler.postDelayed(runnable, 5000);
    }
};

在同一 Activity 中,我可以通过按终止按钮来删除回调,调用:

handler.removeCallbacks(runnable);

当调用上面的内容时,Toast 停止显示,所以到目前为止一切都很好。当我离开 Activity 转到另一个 Activity 时,Toast 消息继续显示,这就是我想要的,但是当我返回到创建可运行对象的第一个 Activity 并按终止按钮时,它不会删除可运行对象。当我离开和回来时,我无法再删除可运行的文件。

我已经尝试使用几乎所有我见过的在 SO 上使用处理程序和可运行对象的示例,但没有任何东西可以帮助我解决这个问题。

当我离开 Activity 并返回时,它会创建新的可运行对象和处理程序对象吗?如果是这样,为什么初始可运行对象会继续运行?

最佳答案

在 Activity 中保留长期引用是很糟糕的形式。即使您旋转手机,它们也经常很容易被破坏并重新创建!发生的情况是,当重新创建 Activity 时,会像您怀疑的那样创建一个新的 Runnable 和 Handler 对象。

为了在不诉诸服务的情况下解决这个问题,我所做的就是创建一个 Fragment…我们称之为 StateFragment。

不给该 Fragment 任何 View ,因此用户看不到它。它仅用于存储变量。创建 Activity 后,将其添加到 Activity 中(如果尚不存在)。最后,在Fragment类本身中,在其onCreate中,将RetainInstance设置为true。

我承认这有点像黑客,但它是在创建和销毁 Activity 时在流程中保留变量的一种非常方便的方法。在这种情况下,当 Activity 被销毁并重新创建时,该 fragment 可能会被保留,除非它已经在后台运行了一段时间并被 GC 清理了。下面是一些代码:

public class StateFragment extends Fragment{
  //add some variables here
  //these will not last long time!
  Handler handler;
  Runnable runnable;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Retain this fragment across configuration changes.
    setRetainInstance(true); //<--this is the important part!
        Handler = new Handler... etc.



  }
}

现在在您的 Activity 中,有一个类级变量来保存引用:

public Class MainActivity  extends FragmentActivity {
StateFragment sf;

然后在“onCreate”中,您需要检查它是否存在,否则附加它:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sf=(StateFragment) getFragmentManager().findFragmentByTag("storage");
if (sf==null)
{
  sf=new StateFragment();
  getFragmentManager().beginTransaction().add(sf, "storage").commit();
}

总的来说,我发现 Activity 的波动性是一个巨大的痛苦,而拥有一些更持久的存储通常是一个很大的好处。现在您可以轻松地将 Runnable 引用为

sf.runnable

关于android - 离开并返回 Activity 时,删除处理程序回调将停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576922/

相关文章:

android - Android中Looper、Handler和MessageQueue是什么关系?

javascript - Google 可视化 map 选择事件未触发

android - 如何每秒自动刷新我的 Android Activity 中显示的数据

java - Android 中的线程和崩溃

java - RecyclerView 的加载时间问题

Android ListView 不同的分割线图片

ios - UIAlertAction 处理程序未在 iOS 9 上跨 UIWindows 调用

java - Runnable 发布成功但没有运行

android - 资源数组

java - 是否可以在 while 循环中设置可变数量的条件?