Android开发之在子线程中更新UI

转自第一行代码-Android

Android是不允许在子线程中进行UI操作的。在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制。

代码如下:

 1 public class MainActivity extends Activity implements OnClickListener {
 2     private static final int UPDATE_TEXT=1;
 3     private TextView textView;
 4     private Button changeTextBT;
 5     private Handler handler=new Handler(){
 6         public void handleMessage(Message msg) {
 7             switch (msg.what) {
 8             case UPDATE_TEXT:
 9                 textView.setText("Nice to meet you");
10                 break;
11             default:
12                 break;
13             }
14         };
15     };
16
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.activity_main);
21         textView=(TextView) findViewById(R.id.textView);
22         changeTextBT=(Button) findViewById(R.id.changTextBT);
23         changeTextBT.setOnClickListener(this);
24     }
25
26     @Override
27     public void onClick(View v) {
28         switch (v.getId()) {
29         case R.id.changTextBT:
30             new Thread(new Runnable() {
31                 @Override
32                 public void run() {
33                     Message message=new Message();
34                     message.what=UPDATE_TEXT;
35                     handler.sendMessage(message);
36                 }
37             }).start();
38             break;
39
40         default:
41             break;
42         }
43     }
44 }

新增了一个Handler对象,并重写父类的handlerMessage()方法, 对具体的Message进行处理。如果发现Message的what字段为UPDATE_TEXT,就把textview更新了。

button的点击事件,没有对UI直接操作, 而是创建了一个Message(android.os.Message)对象,并将它的what字段指定为UPDATE_TEXT。然后调用Handler的sendMessage()方法将这条消息发出去。很快,Handler就会收到这条Message,并在handlerMessage()方法中对它进行处理。此时handlerMessage()方法中的代码就是在主线程当中运行的,所以可以更新UI了。接下来根据Message携带的what字段进行判断,如果登陆UPDATE_TEXT,就将Textview显示的内容更新为Nice to meet you.

时间: 2024-10-12 15:25:29

Android开发之在子线程中更新UI的相关文章

android 不能在子线程中更新ui的讨论和分析

问题描述 做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui只能post到主线程或者使用handler之类.但是仔细看看exception的描述并不是这样的,"Only the original thread that created a view hierarchy can touch its views",只有创建该 view 布局层次的原始线程

使用Handler在子线程中更新UI

Android规定只能在主线程中更新UI,如果在子线程中更新UI 的话会提示如下错误:Only the original thread that created a view hierachy can touch its view((只有原来的线程创建一个视图层次可以触摸它的视图). 只能在主线程中更新UI的原因是:android中相关的view和控件不是线程安全的,我们必须单独做处理. 有的时候需要再子线程中实现更新UI,下面介绍使用Handler实现线程通信的特点实现在子线程中更新UI. H

网络操作不能直接写在主线程中 以及 为什么不能在子线程中更新UI控件的属性

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //注意: 所有网络操作不能直接写在主线程中 因为所有的网络操作都是耗时的,如果加载到主线程中,会导致与用户的交互出现问题 ,所以要加载到子线程中 // [self loadImage]; [self performSelectorInBackground:@selector(loadImage) withObject:nil]; } //加

android子线程中更新UI的方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 参考:Android子线程 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //

老问题:Android子线程中更新UI的3种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 S

Android 在子线程中更新UI的几种方法

第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里运行你要想的操作 比方直接在这里更新ui或者调用回调在 在回调中更新ui } }); context是你传过来的context对象 另外一种: // 假设当前线程是UI线程,那么行动是马上运行.假设当前线程不是UI线程,操作是公布到事件队列的UI线程 // 由于runOnUiThread是Activ

Android开发之在子线程中使用Toast

在子线程中使用Toast的时候,出现Force close. 错误提示:Can't create handler inside thread that has not called Looper.prepare() 解决方法: 1 Looper.prepare(); 2 Toast.makeText(ActivityTestActivity.this, "toast", 1).show(); 3 Looper.loop(); 原因: 子线程只是一个普通的线程,其ThreadLoacl中

在子线程中更新UI,只能使用Handler

package com.pingyijinren.test; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; pu

为什么我们可以在非UI线程中更新UI

尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 看到这样的标题--估计N多人会说我是逗比----因为很多盆友在学习Android(特别是从4.0之后开始入门的)的时候都会常看见或听到别人说我们更新UI呢要在UI线程(或者说主线程)中去更新UI,不要在子线程中更新UI,而Android官方呢也建议我们不要在非UI线程直接更新UI,为什么呢?借助Android官方的一句话来说就是: