android - 带有计时器崩溃的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:只有创建视图层次结构的原始线程才能接触其视图。
解决方案
Android 不允许从除 UI/主线程之外的任何线程更新 UI。我看到你已经创建了一个new Thread
,所以你更新 UI 的东西是在一个工作线程上,这在 Android 中是不允许的。
一个简单的解决方案是创建一个主线程的处理程序并向其发布一个可运行的。
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
// modify UI here
// overlayView.getBackground().setAlpha(150);
}
});
推荐阅读
- javascript - 屏幕显示响应式定位精灵与移相器 3
- linux - cat文件中的-是什么意思-
- c# - 如何使用 PrincipalContext 删除 OU
- node.js - 如何管理 NodeJs TCP 客户端
- angular - “Firebase”类型上不存在属性“firestore”
- python - Pass Lock object to class that inherits multiprocessing.Process
- web-audio-api - WebUSB 和 groupId 识别
- f# - 是否可以将 F# 类型提供程序设计为生成 AST 类型和解析器?
- angular - 当我尝试安装 Angular 时权限被拒绝
- javascript - 每天定时运行 JavaScript 函数