1.Handler,也就是处理者的意思,主要用于发送和处理消息的,发送消息一般是使用Handler的Handler.sendMessage()的 方法,来发送消息 消息的队列是先进先出的顺序.
2.Message 消息的封装者,把异步任务 等封装成Message的对象;
3.Messagequeue 消息队列,用于保存当前线程所有的message对象;
4. looper 巡视者,一直查询消息队列里是否有消息,有消息的通知handler处理数据,没有消息就阻塞,等到有消息的时候
5.Thread :线程,异步任务或者耗时的任务,一般开启一个新的工作线程处理耗时任务
首先handler对象发送消息,最后到handlerMessage()的方法 处理发送过来的消息,具体的代码如下
new Thread() {
@Override
public void run() {
String path = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superplus/img/logo_white_ee663702.png";
try {
URL mUrl = new URL(path);
HttpURLConnection conn= (HttpURLConnection) mUrl.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.connect();
if (conn.getResponseCode() == 200) {
InputStream inputStream = conn.getInputStream();
Log.e("cc", "inputstream" + inputStream.toString());
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
Message message = Message.obtain();
message.obj = bitmap;
message.what = 1;
mhandHandler.sendMessage(message);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
首先我开启一个新的线程去做网络的异步下载,得到后的数据,bitmap对象,
message.obj=bitmap;把bitmap的对象封装到message里面.
然后通过Handler的对象发送消息
public class MainActivity extends AppCompatActivity {
private ImageView image;
private InputStream is;
private Handler mhandHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
// is = (InputStream) msg.obj;
// Bitmap bitmap = BitmapFactory.decodeStream(is);
Bitmap bitmap = (Bitmap) msg.obj;
image.setImageBitmap(bitmap);
Log.e("cc", "is" + is.toString());
}
}
};
发送过来的消息,在ui线程里,直接更新ui
有一点需要注意的是,android在创建UI线程的时候,已经把Looper的对象生成过了,
但是你自己创建线程的话,就需要手动创建一个Looper对象的实例了 ,具体的代码如下;
public class MainActivity extends Activity {
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//开启子线程
public void start(View v){
new MyThread().start();
}
//=向子线程发送消息
public void send(View v){
Message msg = Message.obtain();
msg.what = 100;
msg.obj ="AAAAAAAAA";
handler.sendMessage(msg);
}
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare();
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
String str = (String) msg.obj;
int flag = msg.what;
Log.i("===MSG===", "==str="+str+"==flag=="+flag);
}
};
Looper.loop();
}
}
</pre>这里如果没有Looper.prepare();方法的话,会直接包如下的错误<p></p><p><span style="font-size:18px"></span></p><pre name="code" class="java">java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
具体的意思就是,不能再
Looper.prepare()方法之前创建一个Handler的实例;
还有如果没有Looper.Loop();方法的话,Looper的对象是不会工作,也就是不会循环的查询消息队列是否有消息的,只有调用这个方法 Looper才能工作的