Kotlin中的Runnable线程在模拟器中运行良好,但在设备上显示错误

时间:2018-08-04 05:54:02

标签: android kotlin

以下代码在模拟器上运行良好,但在设备上运行时却出现以下错误

  

只有创建视图层次结构的原始线程才能触摸其   视图。

 Thread(Runnable {
  name.setText(ob.get("name").toString());
 }).start();

2 个答案:

答案 0 :(得分:1)

在您的线程内,将您的settext代码放在下面的代码中。

通常,您从另一个线程触摸了UI视图,因此必须在传递给Runnable方法的runOnUiThread()实例中在UI线程上执行。

runOnUiThread(new Runnable() {

  @Override
  public void run() {

    // write your UI name.settext code here.
    name.setText(ob.get("name").toString());

  }
});
  

对于Kotlin

this@YourActivityName.runOnUiThread(java.lang.Runnable {
this.name.text = (ob.get("name").toString())
})
  

引用:-代表runOnUiThread

答案 1 :(得分:0)

您不能从后台线程操纵UI线程(AKA主线程)。 这就是大多数(如果不是全部)UI框架上的工作方式。 在Android中,UI由UI线程处理,只有它才能处理与UI相关的所有事情。

您的代码可以在仿真器上运行的事实可能是由于纯粹的大小写所致,也许,如果您将其运行了十几次/成百上千次,它似乎就可以工作了。这与多线程代码似乎一直可以工作并且可能在几周甚至几年后由于死锁或竞争条件而停止工作时的行为相同。

Aving表示,鉴于可用的上下文很少,您可以使用 runOnUiThread(),但请先阅读this

最后一件事:如果要从某个源(数据库或网络?)在后台线程中检索数据,那么直接访问视图元素就很奇怪。您应该在其他地方(例如,存储库)重新部署后台逻辑,并避免使用“普通”线程,尤其是在“活动/片段”或其他寿命较短的组件上使用,因为在配置更改的情况下,线程可能会超出“活动/片段”生命周期。如果您没有非常注意,则对Thread内部视图的引用可能会导致内存泄漏,从而导致对您的活动的引用被保留在内存中(系统完成后),从而阻止垃圾回收器消除它。简而言之,您将面临OutOfMemoryException的风险。