Android中多线程编程(三)Handler更新UI的方式

Handler更新UI的方式和原因以及遇到的问题

1.方式:

只能通过Handler来更新UI。

代码如下:

package com.chengdong.su.handlerdemo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;/** * android中更新UI的方式 * * @author scd * */{private String TAG = getClass().getSimpleName();private String mName = “HandlerThread”;private TextView mView;/** the object of the Handler */private Handler mHandler = new Handler() {(Message msg) {Log.d(TAG, “——>handleMessage() 主线程:” + Thread.currentThread());mView.setText(“主线程02”);};};(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();Log.d(TAG, “——>onCreate() 主线程:” + Thread.currentThread());new Thread() {() {try {Thread.sleep(2000);Log.d(TAG, “——>Thread() 子线程:” + Thread.currentThread());updateUI04();} catch (InterruptedException e) {e.printStackTrace();}};}.start();}/*** init the view*/() {mView = (TextView) findViewById(R.id.textView1);}/*** 更新UI的方式1*/() {Log.d(TAG, “——>updateUI01() Thread() 子线程:” + Thread.currentThread());mHandler.post(new Runnable() {() {Log.d(TAG,”——>updateUI01() Thread() run() 主线程:”+ Thread.currentThread());mView.setText(“主线程01″);}});}/*** 更新UI的方式2*/() {Log.d(TAG,”——>updateUI02() Thread() 子线程:” + Thread.currentThread());mHandler.sendEmptyMessage(0);}/*** 更新UI的方式3*/() {Log.d(TAG,”——>updateUI03() Thread() 子线程:” + Thread.currentThread());// 更新UI界面中的组件runOnUiThread(new Runnable() {() {Log.d(TAG,”——>updateUI03() Thread() run() 主线程:”+ Thread.currentThread());mView.setText(“主线程03″);}});}/*** 更新UI的方式4*/() {Log.d(TAG,”——>updateUI04() Thread() 子线程:” + Thread.currentThread());mView.post(new Runnable() {() {Log.d(TAG,”——>updateUI04() Thread() run() 主线程:”+ Thread.currentThread());mView.setText(“主线程04”);}});}}

推荐使用第一种和第二种。

2.使用Handler更新UI的原因:

如果当前线程和主线程不相等的话,更新UI就会抛出异常。 Activity检查当前线程和主线程是否相等是在onResume()方法才开始的。 所以在新开启的线程,如果不休眠直接更新UI的话不会抛出异常。 如果休眠再做更新UI操作的话就会抛出异常。

例子如下:(不要这样使用,,只是为了演示说明)

(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();Log.d(TAG, “——>onCreate() 主线程:” + Thread.currentThread());new Thread() {() {{Thread.sleep(2000);// 出现异常mView.setText(“主线程02”);} catch (InterruptedException e) {e.printStackTrace();}};}.start();}

3. Android开发中Handler的使用遇到的问题:

1.不能在子线程中更新UI。 2.如果在子线程创建Handler的时候,一定要创建一个Looper对象:Looper.prepare();

你曾经说,等我们老的时候,

Android中多线程编程(三)Handler更新UI的方式

相关文章:

你感兴趣的文章:

标签云: