2016-04-27 63 views
0

在Android中,如果我想在非UI线程(如的setText为TextView的)来修改一些视图的属性,我必须写代码这样的:为什么non-ui线程无法修改视图属性?

runOnUiThread(new Runnable(){ 
    textView.setText("Hello world"); 
}); 

而在C#中,我必须使用委托,这更复杂。

那么为什么他们(框架)不帮我们在内部代码中做这些事情?

void setText(string text){ 
    if(isInMainThread()){ 
     //direct set text 
    }else{ 
     post(new Runnable(){ 
     setText(text); 
     }); 
    } 
} 

是否有任何理由类同Java线程停止方法不推荐使用,因为流量必须通过编码器来控制吗?

在此先感谢,并原谅我可怜的英语。

+0

所有与UI绘图相关的工作都在1个线程中完成,因此改变UI的代码应该被推送到这个线程,否则会出现并发问题 – Bhargav

+0

我同意。但是,为什么框架不能帮助我们做这些exra的事情,他们可以检测,如果不在主线程然后记录它,并在主线程后做这些事情。 –

回答

1

简短回答:由于Android的单线程架构,UI工具包不是线程安全的。

在这里你可以找到Android的官方文档的完整的答案Android - Processes and Threads

当应用程序组件启动,应用程序没有运行任何其他成分,Android系统开始一个新的Linux程序与应用程序一个执行线程。默认情况下,同一应用程序的所有组件都运行在相同的进程和线程中(称为“主”线程)。

此外:

的Andoid UI工具包不是线程安全的。所以,你不能从工作者线程操纵你的UI - 你必须从UI线程对你的用户界面进行所有操作。因此,有简单的两个规则Android的单线程模型:

  1. 不要阻塞UI线程
  2. 不要从UI线程
+1

线程创建者明白为什么android是单线程的,他想知道的是为什么像'TextView.setText'这样的方法负责检查是否在UI线程上执行特定的方法,如果不是在UI线程中运行代码代替。像他在他的问题 – Bhargav

+0

中发布的代码片段,他可以出于上述原因,UI不是线程安全的。 –

1

是外部访问Android的UI工具包,我同意,创作者可以这样做,但可能它来自Android架构的SOLID设计。

SOLID是一个首字母缩写,代表了面向对象编程和设计的5个基本原理。在我看来,如果view'd检查了调用哪个方法的线程,它将违反单个责任原则 - view应负责检查使用哪个线程?恕我直言,它不应该。我认为Android的创作者会同意我的观点)

据我所知在当前体系结构中,当您通过setText方法更改文本时,视图会发送通知其状态已更改并且操作系统负责重新绘制它,但是说实话,我仍然不知道它是如何处理的细节。

此外,采用这种方法,Android创作者试图鼓励应用程序开发人员考虑在哪个线程上调用哪些操作 - 例如,大型计算任务不应该是UI动画的一部分。

+0

感谢您的回答。 –

+0

@DaSqyStc不客气 –

相关问题