全局handler

全局Handler封装,优雅的书写handler的UI刷新界面

在Android开发中我们会经常使用handler进行ui界面的刷新,这主要是源于Android的线程机制和消息机制。Android不允许开发者在主线程中刷新ui界面,所以我们会经常用到消息机制,但是频繁的创建handler有可能导致内存泄漏,而且容易造成代码冗余,影响代码质量,所以我们要设置一个全局的handler,通过接口实现来实现ui刷新。

请看代码:

import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class GlobalHandler extends Handler{

    private HandleMsgListener listener;
    private String Tag = GlobalHandler.class.getSimpleName();

    //使用单例模式创建GlobalHandler
    private GlobalHandler(){
        Log.e(Tag,"GlobalHandler创建");
    }

    private static class Holder{
        private static final GlobalHandler HANDLER = new GlobalHandler();
    }

    public static GlobalHandler getInstance(){
        return Holder.HANDLER;
    }
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (getHandleMsgListener() != null){
            getHandleMsgListener().handleMsg(msg);
        }else {
            Log.e(Tag,"请传入HandleMsgListener对象");
        }
    }

    public interface HandleMsgListener{
        void handleMsg(Message msg);
    }

    public void setHandleMsgListener(HandleMsgListener listener){
        //getInstance();
        this.listener = listener;
    }

    public HandleMsgListener getHandleMsgListener(){
        return listener;
    }
    //将消息发送给消息队列
    public static void send(int what,Object object,GlobalHandler mHandler){
        Message message = Message.obtain();
        message.what = what;
        message.obj = object;
        mHandler.sendMessage(message);
        //mHandler.removeCallbacksAndMessages(null);    //清空消息
    }
    public static void sendShow(int what, Object object, HandleMsgListener context){
        GlobalHandler handler = GlobalHandler.getInstance();
        handler.setHandleMsgListener(context);
        send(what,object,handler);
        handler.removeCallbacks(null);      //用完就销毁
    }

}

使用方法:

public class MainActivity extends AppCompatActivity implements GlobalHandler.HandleMsgListener {

    private TextView mtv;
    private int i=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mtv = findViewById(R.id.mText);
    }

    public void onClick(View view){
        switch (view.getId()){
            case R.id.mUI:
                GlobalHandler.sendShow(0x01,"已完成改变的线程"+(i++),MainActivity.this);
                break;
        }
    }
    @Override
    public void handleMsg(Message msg) {
        switch (msg.what){
            case 0x01:
                mtv.setText(msg.obj.toString());
                break;
        }
    }

效果图:

图片丢失了

根据这篇博客有感而发:全局Handler的封装_全局的handler-CSDN博客

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值