使用Handler with Postdelayed更新通知

时间:2014-12-22 08:20:49

标签: java android

我正在尝试使用TimerTask()与postDelayed相关联的Handler()每隔1秒更新一次运行方法任务的通知但是我似乎正在从事物的外观中正确地执行它。 以下是我的代码中的示例:

 Timer timer = new Timer();
    TimerTask task = new TimerTask(){

            @Override
            public void run() {
                updateNotificationUi();
            }
        };

        timer.scheduleAtFixedRate(task, 0, 1000);
}

然后updateNotificationUi()方法代码:

private void updateNotificationUi() {

    new Handler().postDelayed(new Runnable(){

        @Override
        public void run() {

            if(isRunning) {

  mNotificationBuilder.setContentTitle("Text").setContentText("This value here updates every 1 sec").setSmallIcon(R.drawable.ic_launcher);

 mNotifyManager.notify(notificationID, mNotificationBuilder.build());


            }
        }

    }, 1000);
}

运行我的应用时遇到的错误是12-22 07:37:20.556: E/AndroidRuntime(6555): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 有关如何解决此问题的任何建议吗?

3 个答案:

答案 0 :(得分:1)

尝试像这样调用你的处理程序:(谷歌搜索可能有所帮助)

    new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){

        @Override
        public void run() {

            if(isRunning) {

  mNotificationBuilder.setContentTitle("Text").setContentText("This value here updates every 1 sec").setSmallIcon(R.drawable.ic_launcher);

 mNotifyManager.notify(notificationID, mNotificationBuilder.build());


            }
        }

    }, 1000);

答案 1 :(得分:1)

如果不使用mNotificationBuilder,则无法在线程内构建UI thread。同样适用于AlertDialogs

请参阅this post

答案 2 :(得分:1)

是的,有一个更优雅的解决方案

你可以将Handler和Runnable定义为像这样的全局变量(注意" postDelayed"在runnable中):

Handler myHandler;

Runnable runnable = new Runnable(){

    @Override
    public void run() {

        if(isRunning) {

           mNotificationBuilder.setContentTitle("Text").setContentText("This value here updates every 1 sec").setSmallIcon(R.drawable.ic_launcher);

           mNotifyManager.notify(notificationID, mNotificationBuilder.build());

           myHandler.postDelayed(runnable, 1000);
        }
    }

};

...

然后在你的方法中启动循环:

private void updateNotificationUi() {

    myHandler = new Handler();

    myHandler.postDelayed(runnable, 1000);
}

也可能你需要一个停止条件,也许是一个布尔标志arroung" postDelayed"在里面可以运行。像这样:

if(shouldContinueLooping){
    myHandler.postDelayed(runnable, 1000);
}