Android线程之异步消息处理机制(一)

  Android不允许在子线程中进行UI操作,但是有些时候,我们必须在子线程里去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件。对于这种情况,Android提供了一套异步消息处理机制,完美地解决了在子线程中进行UI操作的问题。

主线程:

1、新建Handler对象

2、重写父类handleMessage方法,在这里进行UI操作,此方法的代码在主线程中。

子线程:

1、创建Message对象

2、指定Message的what字段

3、调用handler的sendMessage方法,把message发送出去

举例如下:

MainActivity.java:

 1     package com.junhao.updateui;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.Message;
 7 import android.view.View;
 8 import android.view.View.OnClickListener;
 9 import android.widget.Button;
10 import android.widget.TextView;
11 
12 public class MainActivity extends Activity implements OnClickListener {
13     
14     public static final int UPDATE_TEXT = 1;
15     private TextView text;
16     private Button changeText;
17     
18     private Handler handler = new Handler (){//新建Handler对象
19         public void handleMessage(Message msg){//重写父类handleMessage方法,在这里进行UI操作,此方法的代码在主线程中。
20             switch (msg.what){
21             case UPDATE_TEXT:
22                 text.setText("再见");
23                 break;
24             default:
25                 break;
26             }
27         }
28     };
29 
30     @Override
31     protected void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         setContentView(R.layout.activity_main);
34         
35         text = (TextView)findViewById(R.id.textview);
36         changeText = (Button)findViewById(R.id.changetext);
37         changeText.setOnClickListener(this);
38     }
39     
40     public void onClick(View v){
41         switch (v.getId()){
42         case R.id.changetext:
43             new Thread(new Runnable(){//创建子线程
44                 public void run() {
45                     Message message = new Message();//创建Message对象
46                     message.what = UPDATE_TEXT;//指定Message的what字段
47                     handler.sendMessage(message);//调用handler的sendMessage方法,把message发送出去
48                 }
49             }).start();
50             break;
51         default:
52             break;
53         }
54     }
55 }

activity_main.xml:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     tools:context="${relativePackage}.${activityClass}" >
 6 
 7     <TextView
 8         android:id="@+id/textview"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="@string/text" 
12         android:layout_centerInParent="true"/>
13     
14     <Button 
15         android:id="@+id/changetext"
16         android:layout_width="match_parent"
17         android:layout_height="wrap_content"
18         android:text="@string/btn"/>
19 
20 </RelativeLayout>

strings.xml:

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3 
4     <string name="app_name">updateUI</string>
5     <string name="text">你好</string>
6     <string name="btn">更新UI</string>
7 
8 </resources>

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。