java - 主线程上的 Android 处理程序使应用程序崩溃
问题描述
我是android开发的新手。我正在尝试在一个单独的线程上实现一个简单的任务,该线程在后台运行并定期更新 UI 组件。我的应用程序工作了一段时间并崩溃了。我使用了一个简单的 Handler+Runnable 机制。我知道有多种(和更好的)方法可以做到这一点,但我只是想了解为什么这不起作用。此外,任何关于我如何在未来自己解决问题的提示都将不胜感激。
public void EditUIComponent() {
mainHandler = new Handler(Looper.getMainLooper());
final Runnable textUpdateRunnable = new Runnable() {
@Override
public void run() {
Log.i(TAG, "in Edit Text Runnable Countdown");
for (int i = 10; i > 0; i--) {
String val = String.valueOf(i);
Log.i(TAG, "calculating countdown" + i + " Thread id" + Thread.currentThread().getId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mainHandler.post(new Runnable() {
@Override
public void run() {
Log.i(TAG, "editing countdown" + val + " from thread id" + Thread.currentThread().getId());
editText.setText(val);
}
});
}
}
};
new Thread(textUpdateRunnable).start();
}
buttonStart.setOnClickListener(v -> {
EditUIComponent();
});
Logcat 有以下内容: I/rabackgroundap: Thread[6,tid=7696,WaitingInMainSignalCatcherLoop,Thread*=0xe6e0c410,peer=0x13100228,"Signal Catcher"]: 对信号 3 做出反应 I/rabackgroundap: 将堆栈跟踪写入 tombstoned
解决方案
推荐阅读
- python - 如何画出keras CNN架构?
- sql - 使用池连接 SQL 服务器数据库,查询错误,字段使用重音
- c# - MSBuild - 根据构建配置复制一个或另一个文件
- elasticsearch - 根据字段值匹配、顺序和有限时间范围生成 Elasticsearch 查询输出
- mongodb - Docker Mongo 实例的身份验证不正确
- rust - 没有为 Crate 结构实现调试
- ios - 如何动态改变 UICollectionView 的高度以适应内容大小
- javascript - 如何在 Puppeter 中传递变量和函数?
- javascript - 将 SWR 与 Redux 一起使用是正确的还是好的做法?
- ffmpeg - ffmpeg/ffprobe 获取视频/音频流的 HLS 'codecs' 字符串