美文网首页
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,传递参数

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

  • Android 异步处理

    Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 概述:每个Android应用...

  • Android Handler机制

    定义 一套Android 消息传递机制 作用 在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线...

  • 重温Handler机制、原理

    一、定义: 一套Android消息传递机制 二、作用: 将工作线程中需要更新UI的操作信息传递到UI主线程,实现异...

  • Handler源码分析

    Handler是Android中消息传递机制,可以将工作线程所创建的消息传递到主线程中去处理,进行UI更新或者其他...

  • Handler异步通信机制解析

    定义 Android提供的一套消息传递机制 作用 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 ...

  • 封装工具类无法使用runOnUiThread解决办法

    由于Android中不能在子线程中更新ui,所以平时在子线程中需要更新ui时可以使用Android提供的RunOn...

  • Android的Handler消息机制

    Handler 一套Android的消息传递机制/异步通信机制。在多线程的应用场景中,将工作线程中需要更新UI的操...

  • Handler原理分析

    1、定义 一套 Android 消息传递机制 2、作用 在多线程的应用场景中,将工作线程中需更新 UI的操作信息 ...

  • Kevin Learn Android:Handler

    简介 定义:一套Android消息传递机制 / 异步通信机制 作用:在多线程的应用场景中,将工作线程中需更新 UI...

网友评论

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

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