【问题标题】:Cancel handler.postdelayed from another activity in which it was not created从另一个未创建它的活动中取消 handler.postdelayed
【发布时间】:2013-09-24 14:30:54
【问题描述】:

注意错别字,只是一个模型。

class myActivity1 extends Activity
{
 oncreate()
  {
    Handler myHandler = new Handler();
    myHandler.postDelayed(myRunnable,1000)
  }

 onPause()
  {
  }
}

处理程序完成其工作,1 秒后 myRunnable 运行。假设我在 myRunnable 中调用另一个 postDelayed,它会重新启动 postDelayed 以进行重复。

在 myActivity1 中我没有使用 removeCallbacks() 函数,因此即使我离开活动,myHandler 也会运行。

但是,我的问题是,如何从我移动到的另一个活动中取消 myHandler ? (假设我的应用有 15 个活动,我不知道我在哪一个。)

【问题讨论】:

    标签: android handler android-handler


    【解决方案1】:

    创建一个 Singelton 类,例如:-

    public class MyHandler {
        private static Handler handler;
    
        public static Handler getHandler() {
            if (handler == null) {
                initHandler();
            }
            return handler;
        }
    
        private static void initHandler() {
            handler = new Handler();
            handler.postDelayed(myRunnable,1000);
        }
    
        public static void stopMyHandler() {
            handler.removeCallbacksAndMessages(null);
        }
    
        public static void pauseMyHandler(Runnable myRunnable) {
            handler.removeCallbacksAndMessages(myRunnable);
        }
    
        public static void resumeMyHandler(Runnable myRunnable) {
            handler.postDelayed(myRunnable,1000);
        }
    }
    

    在任何活动中使用MyHandler.getHandler() 运行它并使用MyHandler.stopMyHandler() 停止它。

    在你的Activity 类中:-

        @Override
        public void onPause()
        {
            super.onPause();
            MyHandler.pauseMyHandler(myRunnable);
        }
    
        @Override
        public void onResume()
        {
            super.onResume();
            MyHandler.resumeMyHandler(myRunnable);
        }
    

    在 UI 线程上运行的 Runnable 的代码:-

        runOnUiThread(new Runnable() {
    
              @Override
              public void run() {
                    //update your UI
              }
        });
    

    【讨论】:

    • 每当我在用户按下主页按钮时使用 stopMyHandler 时,当用户重新进入活动时让它在 onResume() 中继续的最佳策略是什么?我计划使用布尔值已停止并打开和关闭它,并在我的应用程序的每个 onResume() 中检查它。
    • 我猜你的答案在这个post
    • 谢谢,关于我是否想从运行单例的线程更改 UI。有可能吗?
    • ,但这取决于Runnable 代码。您应该将runOnUiThread(myRunnable); 放在run() 的实现中。
    • 谢谢@mrsus,如果可能的话你能更新代码吗?谢谢你的预感。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多