消息队列机制messageQuene

主线程在创建的同时会创建两个对象消息队列对象(messageQuene)和轮询器对象(Looper)。

轮询器的作用就是当消息队列有新的消息的时候会通知消息处理器(Handler),这个对象需要我们自己创建,

消息处理器就会调用hangdleMessage来出来这条消息,因为这个方法运行在主线程,所以可以更新ui。

总的来说就是一句话,当消息队列里有新消息时候,hangdleMessage这个方法就会被调用,

子线程如果想更新ui就可以给消息队列发送消息;

在android4.0之后一些耗时的操作不能放在主线程,比如链接网络,下载等等.

这时候我们可以放在一个子线程来做这件事,但是子线程无法更新ui界面

 

package com.example.getimg;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;


import java.io.InputStream;
import java.net.HttpURLConnection;

import java.net.URL;

public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    android.os.Handler handler = new android.os.Handler(){
       //用handlemessage来更新ui线程
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 0:
                    ImageView img = (ImageView) findViewById(R.id.img);
                    img.setImageBitmap((Bitmap) msg.obj);
                    break;
                case 1:
                    Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
                    break;
            }

        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //创建子线程来链接网络,并且使用get方法下载图片
                Thread thread = new Thread(){
                    @Override
                    public void run() {
                        {
                            String path = "http://192.168.21.1:8080/ok/point_one2.png";
                            //uri
                            try {
                                URL url = new URL(path);
                                //获得链接
                                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                                //设置参数
                                conn.setRequestMethod("GET");
                                conn.setConnectTimeout(5000);
                                conn.setReadTimeout(5000);
                                //正式链接
                                conn.connect();
                                if(conn.getResponseCode()==200){
                                    InputStream is = conn.getInputStream();
                                    //把InputStream通过bitmap转化成图片
                                    Bitmap bitmap = BitmapFactory.decodeStream(is);
                                   //创建消息对象
                                    Message msg = new Message();
                                    msg.what = 0;
                                    //传递bitmap所需要的数据,如果是多个数据可以传递数组啊!
                                    msg.obj = bitmap;
                                    //给消息队列发送消息
                                    handler.sendMessage(msg);

                                }else{
                                    //一般不会new,这样会节省内存
                                    Message msg = handler.obtainMessage();
                                    //传递参数为了判断是谁发送的message
                                    msg.what = 1;
                                    handler.sendMessage(msg);
//                                    Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
                                }

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }

                };
                thread.start();
            }
        });
    }
}

 

一般时候message不会直接new出来,而是通过handler.obtainMessage();来进行创建

msg可以用what传递参数为了判断是谁发送的msg

 

 
package com.example.getimg;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;


import java.io.InputStream;
import java.net.HttpURLConnection;

import java.net.URL;

public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
android.os.Handler handler = new android.os.Handler(){
//handlemessage来更新ui线程
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0:
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap((Bitmap) msg.obj);
break;
case 1:
Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
break;
}

}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建子线程来链接网络,并且使用get方法下载图片
Thread thread = new Thread(){
@Override
public void run() {
{
String path = "http://192.168.21.1:8080/ok/point_one2.png";
//uri
try {
URL url = new URL(path);
//获得链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置参数
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//正式链接
conn.connect();
if(conn.getResponseCode()==200){
InputStream is = conn.getInputStream();
//InputStream通过bitmap转化成图片
Bitmap bitmap = BitmapFactory.decodeStream(is);
//创建消息对象
Message msg = new Message();
msg.what = 0;
//传递bitmap所需要的数据,如果是多个数据可以传递数组啊!
msg.obj = bitmap;
//给消息队列发送消息
handler.sendMessage(msg);

}else{
//一般不会new,这样会节省内存
Message msg = handler.obtainMessage();
//传递参数为了判断是谁发送的message
msg.what = 1;
handler.sendMessage(msg);
// Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
}

} catch (Exception e) {
e.printStackTrace();
}
}
}

};
thread.start();
}
});
}
}
posted @ 2015-11-01 15:57  aaddrrooiidd  阅读(317)  评论(0编辑  收藏  举报