// 创建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);