handler:消息处理者
用 handlerMessage()处理
handle.sendMessage() 发送消息
为什么使用:
- 在连接网络,获取网络信息中,发生异常会导致ANR异常(应用程序无响应),所以最好将获取网络信息的步骤放到子线程中,而不是UI线程(主线程)中。
- 改变UI状态(设置,改变等等组件)又必须放到主线程中处理,所以需要handler来在主线程和子线程中传递消息
如何使用:
- 在主线程中(也就是类似MainActivity的类中,新建handler对象,重写handler的handler的handleMessage()方法)
- 在业务代码中创见子线程,用handler.sendMessage()发送消息给主线程中的方法,达到获取信息,更新UI的目的
** 例子:点击事件中,新建线程,用线程来发送图片**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public void onClick(View v) { final String url = mUrl.getText().toString(); if (!TextUtils.isEmpty(url)){ new Thread(new Runnable() { @Override public void run() { Bitmap bitmap = getImageFromNet(url); if (bitmap != null){ Message msg = new Message(); msg.what = SUCCESS; msg.obj = bitmap; handler.sendMessage(msg); }else{ Message msg =new Message(); msg.what = ERROR; handler.sendMessage(msg); } } }).start();
}else { Toast.makeText(this,"请输入内容",Toast.LENGTH_SHORT).show(); }
}
|
在主线程中,重写hanleMessage()方法,得到消息类型来写业务
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private android.os.Handler handler = new android.os.Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SUCCESS: mImage.setImageBitmap((Bitmap) msg.obj); break; case ERROR: Toast.makeText(MainActivity.this,"获取失败",Toast.LENGTH_SHORT).show(); break; } } };
|