首页 > 解决方案 > 带有计时器崩溃的Android服务更新UI

问题描述

因此,我正在尝试使用计时器更新叠加层,但它总是崩溃。我读了一些关于 UI 线程的东西,但我有点迷失了这甚至意味着什么。

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    overlayView.getBackground().setAlpha(50);
    windowManager.addView(overlayView, params);

    new Thread(new Runnable() {
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //crashing here//
                overlayView.getBackground().setAlpha(150);
                //testing if updating
                counter = counter + 1;
                notification.setContentText("number" + counter);
                startForeground(1, notification.build());
            }

        }
    }).start();


    return START_NOT_STICKY;
}

它总是返回这个错误:

android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。

标签: androidmultithreadingservice

解决方案


Android 不允许从除 UI/主线程之外的任何线程更新 UI。我看到你已经创建了一个new Thread,所以你更新 UI 的东西是在一个工作线程上,这在 Android 中是不允许的。

一个简单的解决方案是创建一个主线程的处理程序并向其发布一个可运行的。

new Handler(Looper.getMainLooper()).post(new Runnable() {
       public void run() {
            // modify UI here
            // overlayView.getBackground().setAlpha(150);
       }
});

推荐阅读