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才能工作的