我的活动停止更新通过handler.post或runonuithread

时间:2018-02-07 22:36:47

标签: android android-activity android-contentprovider android-handler

我的应用包含

1)活动
2)服务(forground)
3)contentProvider ...在服务中写入它,从活动中读取它(光标和观察者)

该服务与每秒报告一次数据的设备保持蓝牙连接。然后,该服务将标记/值对写入内容提供者数据库。

活动包括一些文本视图,一些按钮和一些图像视图。它还使用SpeedView拨号包。但是,如果我不使用speedview,问题仍然会发生。

活动为光标加载器回调订阅了contentprovider以初始化屏幕,然后使用contentObserver来监听更改。

在contentObserver onChange(self,uri){}中,它会看到一个更改,请求URI的值,然后继续尝试更新相应的View。

好的,这就是问题所在。因为回调就好像我认为我在主looper中理解“not”,它不能直接直接调用一些UI apis ...例如尝试更改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分钟后有时很快就无法完全预测..但最终处理器.post()不再工作了。我在handler.post之前放置了一个Log,在开始和结束时在run()里面放了一个日志...我总是看到日志完成和GUI更新但是由于某种原因我不会看到除了之前的日志之外的任何日志handler.post(意思是内容提供者回调仍在工作!)

我有点想知道为什么这会持续几分钟然后停止。它就像某种内部循环队列正在填满。

我的其他尝试使用handeler.post(runnable))更改文本视图或其他视图没有这些问题(至少可能我没有看到它们,如果活动没有显示那么久或为其他一些原因?? !!

1 个答案:

答案 0 :(得分:0)

这不是解决方案的真正答案。但是我发现我从Observer调用handler.post的更新速度约为50ms。

虽然它仍然没有解释为什么没有崩溃或错误,但有点快。

我似乎工作的解决方法是使用Observer更新来调用更新UI的handler.post,而不是使用Observer更新来执行观察者类的粗略POLLING并以100ms进行轮询。使用handler.postDelayed()并在其中通过检查观察者类的每个变量的更改(轮询)以查看是否有任何更改来执行UI更新,如果是,则更新UI。