安卓学习之路之Handler的简单实用

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值