Android 子线程更新 UI 的几种方式

Android 子线程中更新 UI

虽然这个大家都已经很清楚,但是,为了方便我自己查看,还是记录一下

为了方便,我把 六种子线程中更新 UI 的方式都写在了一个 xml 文件中

先贴 activity 代码:

public class UIupdateActivity extends BaseActivity {
    @ViewById(R.id.tv_1)
    private TextView mTv1;
    @ViewById(R.id.tv_2)
    private TextView mTv2;
    @ViewById(R.id.tv_3)
    private TextView mTv3;
    @ViewById(R.id.tv_4)
    private TextView mTv4;
    @ViewById(R.id.tv_5)
    private TextView mTv5;
    @ViewById(R.id.tv_6)
    private TextView mTv6;

    Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            // 子线程更新 UI 方式 1:处理接收到的 message
            if (msg.what == 1){
                mTv1.setText("handler 发送 message 更新 UI");
            }
        }
    };

    @Override
    protected void initData() {

    }

    @Override
    protected void initView() {

    }

    @Override
    protected void setContentView() {
        setContentView(R.layout.activity_ui_update);
    }

    @OnClick(R.id.tv_1)
    public void uiUpdate1(){
        // 子线程更新 UI 方式 1:使用 handle 发送 message,通知主线程更新 UI
        new Thread(new Runnable() {
            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what = 1;
                mHandler.sendMessage(msg);
            }
        }).start();
    }

    @OnClick(R.id.tv_2)
    public void uiUpdate2(){
        // 子线程更新 UI 方式 2:使用 View.post 更新 UI
        new Thread(new Runnable() {
            @Override
            public void run() {
                mTv2.post(new Runnable() {
                    @Override
                    public void run() {
                        mTv2.setText("View.post 更新 UI");
                    }
                });
            }
        }).start();
    }

    @OnClick(R.id.tv_3)
    public void uiUpdate3(){
        // 子线程更新 UI 方式 3:使用 handle.post() 更新 UI
        new Thread(new Runnable() {
            @Override
            public void run() {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mTv3.setText("handle.post 更新 UI");
                    }
                });
            }
        }).start();
    }

    @OnClick(R.id.tv_4)
    public void uiUpdate4(){
        // 子线程更新 UI 方式 4:使用 handle.postDelayed() 更新 UI
        new Thread(new Runnable() {
            @Override
            public void run() {
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mTv4.setText("handle.postDelayed() 更新 UI");
                    }
                }, 2000);
            }
        }).start();
    }

    @OnClick(R.id.tv_5)
    public void uiUpdate5(){
        // 子线程更新 UI 方式 5:使用 runOnUiThread 更新 UI
        new Thread(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mTv5.setText("runOnUiThread 更新 UI");
                    }
                });
            }
        }).start();
    }

    @OnClick(R.id.tv_6)
    public void uiUpdate6(){
        // 子线程更新 UI 方式 6:使用 AsyncTask 更新 UI
        // 手动调用execute(Params... params),执行异步线程任务
        // 有几个需要注意的地方:
        // 1、必须在UI线程中调用 2、同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
        new updateAsyncTask().execute();
    }

    /**
     * 三个参数为3个泛型参数指定类型;若不使用,可使用 java.lang.Void 类型代替
     * 这里指定为:输入参数 = String类型、执行进度 = Integer类型、执行结果 = String类型
     */
    class updateAsyncTask extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... strings) {
            publishProgress();
            return null;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mTv6.setText("AsyncTask 更新 UI");
        }
    }
}

然后是 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">
    
    <TextView
        android:id="@+id/tv_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UI Update 1"
        android:gravity="center"
        android:padding="20dp" />
    
    <TextView
        android:id="@+id/tv_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UI Update 2"
        android:gravity="center"
        android:padding="20dp" />
    
    <TextView
        android:id="@+id/tv_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UI Update 3"
        android:gravity="center"
        android:padding="20dp" />
    
    <TextView
        android:id="@+id/tv_4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UI Update 4"
        android:gravity="center"
        android:padding="20dp" />
    
    <TextView
        android:id="@+id/tv_5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UI Update 5"
        android:gravity="center"
        android:padding="20dp" />
    
    <TextView
        android:id="@+id/tv_6"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="UI Update 6"
        android:gravity="center"
        android:padding="20dp" />
    
</LinearLayout>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值