我的 Activity 停止更新一些通过 handler.post 或 runonuithread 更新的视图
My Activity stops updating some Views that are updated via handler.post or runonuithread
我的应用包含
1) 一个 Activity
2)服务(前台)
3) contentProvider...在服务中写入它,在 activity
中从中读取(游标和观察者)
该服务与大约每秒报告一次数据的设备保持蓝牙连接。然后该服务将 tag/value 对写入内容提供商数据库。
activity 由一些文本视图、一些按钮和一些图像视图组成。它还使用 SpeedView 拨号包。但是,如果我不使用 speedview,问题仍然存在。
activity 订阅 contentprovider 以获取光标加载器回调来初始化屏幕,然后使用 contentObserver 来监听变化。
在 contentObserver onChange(self,uri) {} .. 里面会看到一个变化,请求 URI 的值然后继续尝试更新相应的 View。
好的,问题来了。因为回调好像我认为我理解主循环中的"not",它不能直接直接调用一些UI api ...例如试图改变TextView的文本。
在过去,这不是什么大问题,我只是想创建一个处理程序,然后按照这些思路简单地做一些事情...
TextView mytextview...
Handler mHandler = null;
onCreate() { ... mytextview = findviewbyid(...)...
mHandler = new Handler();// No looper means main thread I think
}
onChange(self,uri) {
....
mHandler.post(new Runnable() {
@Override
run() {
mytextview.setText("the new text from the content provider");
}
});
.....
}
那么问题是什么?好吧,一开始什么都没有……这有效……好吧,至少几分钟。大约 15 分钟后,有时有时很快,有时并不完全可预测。但最终 handler.post() 将不再工作。我在 handler.post 之前放置了一个日志,在开始和结束时在 运行() 中放置了一个日志......我总是看到日志完成和 GUI 更新但是对于一些因为我不会看到任何日志,除了 handler.post 之前的日志(这意味着内容提供者回调仍在工作!)
我有点不知所措为什么这会 运行 几分钟然后就停止了。它就像某种内部循环队列正在填满。
我使用 handeler.post(运行nable)) 更改文本视图或其他视图的其他尝试没有这些问题(至少我可能没有看到它们,如果activity 没有显示那么长时间或出于其他原因??!!
嗯,这不是解决方案的真正答案。但是我发现我从调用 handler.post 的观察者那里得到的更新大约是 50 毫秒。
这有点快,但它仍然不能解释为什么没有崩溃或错误。
我的解决方法似乎有效,而不是使用观察者更新来调用更新 UI 的 handler.post,而是对观察者 class 进行粗略的 POLLING 和在 100 毫秒轮询。使用 handler.postDelayed() 并在其中通过检查观察者 class 来更新 UI 每个变量的变化(轮询)以查看它们是否发生变化,如果发生变化然后更新 UI.
我的应用包含
1) 一个 Activity
2)服务(前台)
3) contentProvider...在服务中写入它,在 activity
该服务与大约每秒报告一次数据的设备保持蓝牙连接。然后该服务将 tag/value 对写入内容提供商数据库。
activity 由一些文本视图、一些按钮和一些图像视图组成。它还使用 SpeedView 拨号包。但是,如果我不使用 speedview,问题仍然存在。
activity 订阅 contentprovider 以获取光标加载器回调来初始化屏幕,然后使用 contentObserver 来监听变化。
在 contentObserver onChange(self,uri) {} .. 里面会看到一个变化,请求 URI 的值然后继续尝试更新相应的 View。
好的,问题来了。因为回调好像我认为我理解主循环中的"not",它不能直接直接调用一些UI api ...例如试图改变TextView的文本。
在过去,这不是什么大问题,我只是想创建一个处理程序,然后按照这些思路简单地做一些事情...
TextView mytextview...
Handler mHandler = null;
onCreate() { ... mytextview = findviewbyid(...)...
mHandler = new Handler();// No looper means main thread I think
}
onChange(self,uri) {
....
mHandler.post(new Runnable() {
@Override
run() {
mytextview.setText("the new text from the content provider");
}
});
.....
}
那么问题是什么?好吧,一开始什么都没有……这有效……好吧,至少几分钟。大约 15 分钟后,有时有时很快,有时并不完全可预测。但最终 handler.post() 将不再工作。我在 handler.post 之前放置了一个日志,在开始和结束时在 运行() 中放置了一个日志......我总是看到日志完成和 GUI 更新但是对于一些因为我不会看到任何日志,除了 handler.post 之前的日志(这意味着内容提供者回调仍在工作!)
我有点不知所措为什么这会 运行 几分钟然后就停止了。它就像某种内部循环队列正在填满。
我使用 handeler.post(运行nable)) 更改文本视图或其他视图的其他尝试没有这些问题(至少我可能没有看到它们,如果activity 没有显示那么长时间或出于其他原因??!!
嗯,这不是解决方案的真正答案。但是我发现我从调用 handler.post 的观察者那里得到的更新大约是 50 毫秒。
这有点快,但它仍然不能解释为什么没有崩溃或错误。
我的解决方法似乎有效,而不是使用观察者更新来调用更新 UI 的 handler.post,而是对观察者 class 进行粗略的 POLLING 和在 100 毫秒轮询。使用 handler.postDelayed() 并在其中通过检查观察者 class 来更新 UI 每个变量的变化(轮询)以查看它们是否发生变化,如果发生变化然后更新 UI.