一、使用handler的主要目的
handle主要是为了解决线程间通信问题
二、工作过程
Handler 先进先出原则。
1、Looper: 一个线程可以产生一个Looper对象(也只能一个),由它来管理此线程里的Message Queue(消息队列)。
主线程会自动创建 Looper并执行 具体可以看ActivityThread
public static void main(String[] args) {
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
2、Handler: 可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来 的消息。
3、Message Queue(消息队列):用来存放线程放入的消息。
4、Message 消息
5、线程:UI thread就是main thread,而Android启动程序时会替它建立一个Message Queue。
三、发送消息
2种生成消息的方式
Message message = Message.obtain(); //获取消息池里的消息 节省资源 推荐
Message message = new Message(); //自己创建 耗资源 不推荐
用handle执行Runnable
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
发送消息
sendEmptyMessage(int what)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
四、内存泄漏
原因:内部类持有外部类的引用
解决办法
将Handler声明为静态类(静态类不持有外部类的对象)
弱引用外部类对象
关闭Activity时把消息清空
列子:
private static class MyHandler extends Handler {
WeakReference<LegendSettingUpdateActivity> mWeakReference;
public MyHandler(LegendSettingUpdateActivity activity) {
mWeakReference = new WeakReference<LegendSettingUpdateActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
final LegendSettingUpdateActivity activity = mWeakReference.get();
if (activity != null) {
if (msg.what == 1) {
Intent mIntent = new Intent();
mIntent.putExtra("value", endvalue);
activity.setResult(0, mIntent);
activity.finish();
Toast.makeText(activity, "区间值不合理,请检查", Toast.LENGTH_SHORT).show();
} else {
activity.finish();
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (pDailog != null && pDailog.isShowing()) {
pDailog.cancel();
}
mHandler.removeCallbacksAndMessages(null); //清空消息
}
handle主要是为了解决线程间通信问题
二、工作过程
Handler 先进先出原则。
1、Looper: 一个线程可以产生一个Looper对象(也只能一个),由它来管理此线程里的Message Queue(消息队列)。
主线程会自动创建 Looper并执行 具体可以看ActivityThread
public static void main(String[] args) {
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
2、Handler: 可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来 的消息。
3、Message Queue(消息队列):用来存放线程放入的消息。
4、Message 消息
5、线程:UI thread就是main thread,而Android启动程序时会替它建立一个Message Queue。
三、发送消息
2种生成消息的方式
Message message = Message.obtain(); //获取消息池里的消息 节省资源 推荐
Message message = new Message(); //自己创建 耗资源 不推荐
用handle执行Runnable
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
发送消息
sendEmptyMessage(int what)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
四、内存泄漏
原因:内部类持有外部类的引用
解决办法
将Handler声明为静态类(静态类不持有外部类的对象)
弱引用外部类对象
关闭Activity时把消息清空
列子:
private static class MyHandler extends Handler {
WeakReference<LegendSettingUpdateActivity> mWeakReference;
public MyHandler(LegendSettingUpdateActivity activity) {
mWeakReference = new WeakReference<LegendSettingUpdateActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
final LegendSettingUpdateActivity activity = mWeakReference.get();
if (activity != null) {
if (msg.what == 1) {
Intent mIntent = new Intent();
mIntent.putExtra("value", endvalue);
activity.setResult(0, mIntent);
activity.finish();
}
if (msg.what == 2) {
pDailog.dismiss();Toast.makeText(activity, "区间值不合理,请检查", Toast.LENGTH_SHORT).show();
} else {
activity.finish();
}
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (pDailog != null && pDailog.isShowing()) {
pDailog.cancel();
}
mHandler.removeCallbacksAndMessages(null); //清空消息
}