Handler使用纲要

本文介绍了Handler的创建及使用,包括静态内部类结合弱引用防止内存泄漏的解决方案,详细阐述了发送消息、传递对象、销毁消息以及UI更新的方法。同时,提到了HandlerThread在解决多线程并发问题和实现线程同步中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 创建Handler

– 第一种写法

private Handler mHandler = new Handler(){
    public void handleMessage(Message msg){
        mTextView.setText(""+msg.arg1+"-"+msg.arg2);
    };
};

==》增强版本 --使用静态的内部类 + 虚引用可以解决内存泄漏问题
// 静态的内部类,是随着类的加载而加载,所以静态的内部类就只能访问静态的变量,所以就不就可以解决引用持有问题.

static class MyHandler extends Handler {
    WeakReference<Activity > mActivityReference;
    MyHandler(Activity activity) {
        mActivityReference= new WeakReference<Activity>(activity);
    }
    @Override
    public void handleMessage(Message msg) {
      // 就是通过get()方法可以判断这个对象是否被回收,我们需要判断这个mActivity 是否存在才能做后面的操作..
        final Activity activity = mActivityReference.get();
        if (activity != null) {
            mImageView.setImageBitmap(mBitmap);
        }
    }
}

MyHandler mHandler = new MyHandler(**);

// 发送消息 —添加

new Thread(){
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
//可以去复用系统的Message对象
            Message message = handler.obtainMessage();
            message.arg1 = 88;

// 可以传递对象

 Person person = new Person();
                person.setName("梁文俊");
                person.setAge(18);
                message.obj = person;
        // 第一种写法
            mHandler.sendMessage(message);
        //  或 第二种写法
            mHandler.obtainMessage(SUCCESS_HANDLE, message).sendToTarget();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}.start();

// 销毁或终止消息 – 移除

mHandler.removeCallbacksAndMessages(mReconnectTask);
 mHandler.removeMessages(1); 
调用mHandler.removeCallbacksAndMessages(null);
``
class ChangeRunnable implements Runnable{
    @Override
    public void run() {
        mIndex = mIndex%3;
        mTextView.setText(mTexts[mIndex++]);
        mHandler.postDelayed(mRunnable,1000);
    }
}
mBtnRemove.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        mHandler.removeCallbacks(mRunnable);
    }
});

// 更新UI post – postDelayed

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    mTextView.setText("update");
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

// 延迟 

Runnable runnable = new Runnable() {
@Override
public void run() {
//要做的事情
heartCheck(context);
handler.postDelayed(this, 1000 * 20 ); // 每次延迟20s
}
};
// 2. 启动计时器
handler.postDelayed(runnable, 1000 * 20 );//每20秒执行一次runnable.


// HandlerThread
HandlerThread可以解决一些多线程并发的问题,达到线程的同步的效果。我们可以用它的Looper来新建一个Handler,在Handler的handleMessage中再做操作。这时的handleMessage是在这个HandlerThread中执行的。

HandlerThread thread = new HandlerThread("handler thread");
    Handler handler = new Handler(thread.getLooper()){
        @Override
        public void handleMessage(Message msg) {
            Log.d("test",""+msg.arg1);
        }
    };
    Message message = handler.obtainMessage();
    message.arg1 = 123;
   handler.sendMessage(message);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值