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>
时间: 2024-10-12 15:29:32