Android中多线程编程(三)Handler更新UI的方式
2017-07-28 18:42
155 查看
Handler更新UI的方式和原因以及遇到的问题
1.方式:
仅仅能通过Handler来更新UI。
代码例如以下:
推荐使用第一种和另外一种。
2.使用Handler更新UI的原因:
假设当前线程和主线程不相等的话,更新UI就会抛出异常。
Activity检查当前线程和主线程是否相等是在onResume()方法才開始的。
所以在新开启的线程。假设不休眠直接更新UI的话不会抛出异常。
假设休眠再做更新UI操作的话就会抛出异常。
样例例如以下:(不要这样使用,仅仅是为了演示说明)
3. Android开发中Handler的使用遇到的问题:
1.不能在子线程中更新UI。
2.假设在子线程创建Handler的时候,一定要创建一个Looper对象:Looper.prepare();
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 * */ public class SixActivity extends Activity { private String TAG = getClass().getSimpleName(); private String mName = "HandlerThread"; private TextView mView; /** the object of the Handler */ private Handler mHandler = new Handler() { public void handleMessage(Message msg) { Log.d(TAG, "------>handleMessage() 主线程:" + Thread.currentThread()); mView.setText("主线程02"); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); Log.d(TAG, "------>onCreate() 主线程:" + Thread.currentThread()); new Thread() { public void run() { try { Thread.sleep(2000); Log.d(TAG, "------>Thread() 子线程:" + Thread.currentThread()); // updateUI01(); // updateUI02(); // updateUI03(); updateUI04(); } catch (InterruptedException e) { e.printStackTrace(); } }; }.start(); } /** * init the view */ private void init() { mView = (TextView) findViewById(R.id.textView1); } /** * 更新UI的方式1 */ public void updateUI01() { Log.d(TAG, "------>updateUI01() Thread() 子线程:" + Thread.currentThread()); mHandler.post(new Runnable() { @Override public void run() { Log.d(TAG, "------>updateUI01() Thread() run() 主线程:" + Thread.currentThread()); mView.setText("主线程01"); } }); } /** * 更新UI的方式2 */ public void updateUI02() { Log.d(TAG, "------>updateUI02() Thread() 子线程:" + Thread.currentThread()); mHandler.sendEmptyMessage(0); } /** * 更新UI的方式3 */ public void updateUI03() { Log.d(TAG, "------>updateUI03() Thread() 子线程:" + Thread.currentThread()); // 更新UI界面中的组件 runOnUiThread(new Runnable() { @Override public void run() { Log.d(TAG, "------>updateUI03() Thread() run() 主线程:" + Thread.currentThread()); mView.setText("主线程03"); } }); } /** * 更新UI的方式4 */ public void updateUI04() { Log.d(TAG, "------>updateUI04() Thread() 子线程:" + Thread.currentThread()); mView.post(new Runnable() { @Override public void run() { Log.d(TAG, "------>updateUI04() Thread() run() 主线程:" + Thread.currentThread()); mView.setText("主线程04"); } }); } }
推荐使用第一种和另外一种。
2.使用Handler更新UI的原因:
假设当前线程和主线程不相等的话,更新UI就会抛出异常。
Activity检查当前线程和主线程是否相等是在onResume()方法才開始的。
所以在新开启的线程。假设不休眠直接更新UI的话不会抛出异常。
假设休眠再做更新UI操作的话就会抛出异常。
样例例如以下:(不要这样使用,仅仅是为了演示说明)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); Log.d(TAG, "------>onCreate() 主线程:" + Thread.currentThread()); new Thread() { public void run() { // 不会出现异常 // mView.setText("主线程02"); try { 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的方式
- Handler原理与使用,以及Android中异步更新的UI的方式
- Android异步更新UI的方式之使用Handler的post(Runnabel r)方法
- Android异步更新UI的方式之使用Handler消息传递机制
- Android 在子线程中更新UI的方式,使用handler
- android中的线程执行UI更新方式,以及Handler的初步了解
- Android更新ui 的几种方式?Handler 机制(二)
- Android 更新UI的两种方式--Handler & runOnUiThread
- Android中在子线程中更新UI的三种方式
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android开发中更新UI时runOnUIthread(Runnable)与Handler.post(Runnable)的区别及如何选择
- Android 更新ui的集中方式
- Android更新UI的两种方法——handler与runOnUiThread()
- Android Handler+Thread实现更新Ui
- Android更新UI的五种方式
- Android 中更新 UI 的几种方式
- [置顶] Android_Thread多线程_Handler,Message,Looper,MessageQueue多线程和特殊UI更新
- Android UDP通信之Handler、Activity、UI更新
- android studio 更新ui的四种方式 handler