Handler发送消息,周期性更新UI总结

1.Handler的作用

handler是用于线程间发送消息和处理消息的。

2.Handler发送消息的方式

1.最常用的方式是:
handler.sendMessage()、handler.sendEmptyMessage()、handler.sendMessageAtTime()、handler.sendMessageDelayed()等方法都是将消息发送到handler自己,它们的区别就是发送消息时是否延时,然后通过handler重写的handleMessage方法来处理。
在onCreate方法中,开启一个子线程,处理耗时操作,然后发送消息给handler处理,代码如下:

new Thread(new Runnable() {
            @Override
            public void run() {
            //耗时操作 ...
                mHandle.sendEmptyMessage(1);
            }
        }).start();

然后在handler实例化时,重写handleMessage方法,处理子线程发过来的消息:

private Handler mHandle = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    tvHandler.setText("handler.sendMessage" +1);
                    break;
                default:
                    break;
            }
        }
    };

2.handler.post(myRunnable)+runnable的方式处理
handler.post(myRunnable)、
handler.postDelayed(myRunnable,time)等方法,将消息交给runnable处理

mHandlerRunnable.postDelayed(myRunnable,1000);

定义handler和runnable

private Handler mHandlerRunnable = new Handler();
    private Runnable myRunnable = new Runnable() {
        @Override
        public void run() {
            tvRunnable.setText("runnable+handle.postdelayer"+1);
        }
    };

其实通过阅读源码发现,系统将runnable接口包装成Message,最终还是调用handler.sendMessage的方式处理。
3.通过runOnUiThread(new Runnable)的方式处理

private void updateUI(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvRunOnUi.setText("runOnUiThread"+1);
            }
        });
    }

4.通过view.post(new Runnable)的方式处理

private void viewPost(){
        tvViewPost.post(new Runnable() {
            @Override
            public void run() {
                tvViewPost.setText("viewPost"+1);
            }
        });
    }

如图所示,看四种方法更新四个textview的效果:
这里写图片描述

3.用handler周期性的更新UI

通过handler.sendMessage的方式与TimerTask配合,周期性更新UI

Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                myHandlerTimeTask.sendEmptyMessage(1);
            }
        };
        timer.schedule(task,0,1000);
private Handler myHandlerTimeTask = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            tvTimeTask.setText("runnable+handle.postdelayer+timeTask"+title);
            title++;
        }
    };

大家感兴趣的话,也可以尝试用handler.post(runnable)的方式周期性更新UI,注意用runnable,需要在onDestroy方法中调用mHandlerRunnable.removeCallbacks(myRunnable);
看效果图:
这里写图片描述

完整代码如下:
布局文件,一个LinearLayout,五个textview

activity代码:
package com.hw.yjg.testview;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

public class HandleDemoActivity extends AppCompatActivity {

    private TextView tvHandler;
    private TextView tvRunnable;
    private TextView tvRunOnUi;
    private TextView tvViewPost;
    private TextView tvTimeTask;
    private int title = 0;

    //handleMessage + handler.sendMessage
    private Handler mHandle = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    tvHandler.setText("handler.sendMessage" +1);
                    break;
                default:
                    break;
            }
        }
    };

    //Runnable + Handler.postDelayed(runnable,time)
    private Handler mHandlerRunnable = new Handler();
    private Runnable myRunnable = new Runnable() {
        @Override
        public void run() {
            tvRunnable.setText("runnable+handle.postdelayer"+1);
        }
    };

    private void updateUI(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvRunOnUi.setText("runOnUiThread"+1);
            }
        });
    }

    private void viewPost(){
        tvViewPost.post(new Runnable() {
            @Override
            public void run() {
                tvViewPost.setText("viewPost"+1);
            }
        });
    }

    //Handler.sendMessage+TimerTask
    private Handler myHandlerTimeTask = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            tvTimeTask.setText("handle.sendMessage+timerTask"+title);
            title++;
        }
    };   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handle_demo);

        tvHandler = (TextView) findViewById(R.id.tvHandler);
        tvRunnable = (TextView) findViewById(R.id.tvRunnable);
        tvRunOnUi = (TextView) findViewById(R.id.tvRunOnUiThread);
        tvViewPost = (TextView) findViewById(R.id.tvViewPost);
        tvTimeTask = (TextView) findViewById(R.id.tvTimeTask);

        //1.子线程+handleMessage
        new Thread(new Runnable() {
            @Override
            public void run() {
                mHandle.sendEmptyMessage(1);
            }
        }).start();

        //2.handler.post(myRunnable)+runnable
        mHandlerRunnable.postDelayed(myRunnable,1000);

        //3.runOnUiThread
        updateUI();

        //4.view.post(new Runnable)
        viewPost();

        /*Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTask(),0,500);*/

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                myHandlerTimeTask.sendEmptyMessage(1);
            }
        };
        timer.schedule(task,0,1000);       
    }
    @Override
    protected void onDestroy() {
        mHandlerRunnable.removeCallbacks(myRunnable);
        super.onDestroy();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值