美文网首页
Android中的Thread+Handler更新UI,传递参数

Android中的Thread+Handler更新UI,传递参数

作者: 大道至简_知易行难 | 来源:发表于2019-01-22 12:17 被阅读0次

    很久没写笔记了,今天总结一下Android中多线程更新UI
    如下通过按钮启动Thread,在主线程通过handler更新textView的数据变化


    QQ图片20190122141120.gif
    /**
     * @author SuTongsheng
     * @create 2019/1/22
     * @Describe 在线程中更新UI
     */
    public class ThreadUiActivity extends AppCompatActivity {
    
        @BindView(R.id.tv_num)
        TextView tvNum;
        @BindView(R.id.bt_start)
        Button btStart;
        @BindView(R.id.bt_stop)
        Button btStop;
        private static final int NUM1 = 0x21;
        private static final int NUM2 = 0x22;
        private int tempNum = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_thread_ui);
            ButterKnife.bind(this);
    
        }
    
        @SuppressLint("HandlerLeak")
        private Handler myHandle = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case NUM1:
                        tvNum.setText(msg.obj + "");
                        break;
                    case NUM2:
                        tempNum++;
                        tvNum.setText(tempNum + "");
                        break;
                    default:
                        break;
                }
    
            }
        };
    
        @OnClick({R.id.tv_num, R.id.bt_start, R.id.bt_stop})
        public void onViewClicked(View view) {
            switch (view.getId()) {
                case R.id.tv_num:
                    break;
                case R.id.bt_start:
    //                new MyThread().start();//1
    //                new Thread(new Runnable() {//2 匿名内部类
    //                    @Override
    //                    public void run() {
    //
    //                    }
    //                }).start();
                    new Thread(new MyRunnable()).start();//3
                    break;
                case R.id.bt_stop:
                    new MyThread().start();//1
                    break;
            }
        }
    
        public class MyRunnable implements Runnable {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(100);
                        Message message = new Message();//传递数据
                        message.what = NUM1;
                        message.obj = i;
                        myHandle.sendMessage(message);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        public class MyThread extends Thread {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(100);
                        myHandle.sendEmptyMessage(NUM2);//记录标志,区分标记更新UI
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    代码中创建子线程用了三种方法,继承Thread、实现Runnable和匿名内部类
    更新UI用了通过handler.sendEmpty发送标记给UI主线程,通过标记识别更新处理UI。以及handler.sendMessage,通过创建message对象,赋值msg.what设置标记,msg.obj传递参数更新UI。
    其中的XML文件如下

    <?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:orientation="vertical"
        tools:context=".activity.ThreadUiActivity">
    
        <TextView
            android:id="@+id/tv_num"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/bt_start"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始1" />
    
        <Button
            android:id="@+id/bt_stop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开始2" />
    </LinearLayout>
    

    相关文章

      网友评论

          本文标题:Android中的Thread+Handler更新UI,传递参数

          本文链接:https://www.haomeiwen.com/subject/arlljqtx.html