当前位置: 代码迷 >> Android >> Android handler 详解(口试百分之100问到)
  详细解决方案

Android handler 详解(口试百分之100问到)

热度:240   发布时间:2016-04-24 11:41:54.0
Android handler 详解(面试百分之100问到)

handler在Android中被称为“消息处理者”,在多线程中比较常用。

handler内部实现原理


 

handler实现机制:
1,Message对象,表示要传递的一个消息,内部使用链表数据结构实现一个消息池,用于重复利用,
避免大量创建消息对象,造成内存浪费
2,MessageQueue对象,存放消息对象的消息队列,先进先出原则
3,Looper对象负责管理当前线程的消息队列
4,handler对象负责把消息push到消息队列中,以及接收Looper从消息队列中取出的消息


 

handler的内存泄露问题(activity已经退出,而handler没有退出,这样就可能导致内存泄露)
1,定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义一个静态内部类
2,引用的强弱:强引用→软引用→弱引用


 

下面用获取网络图片代码说明一下handler基本使用

package com.example.uri;import java.io.IOException;import java.io.InputStream;import java.lang.ref.WeakReference;import java.net.MalformedURLException;import java.net.URL;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.Menu;import android.view.View;import android.widget.ImageView;/** *  * 访问网络的操作,必须放在工作线程中完成 * */public class MainActivity extends Activity {    private static final int LOADSUCCESS=0x1;    private static ImageView iv;    private final myhandler handler=new myhandler(this);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv=(ImageView) findViewById(R.id.imageView1);    }    private static class myhandler extends Handler{                private final WeakReference<MainActivity> weakReference;        public myhandler(MainActivity mainActivity){            weakReference=new WeakReference<MainActivity>(mainActivity);        }                public void handleMessage(Message msg) {            MainActivity mainActivity=weakReference.get();            if(mainActivity!=null){                switch (msg.what) {                case LOADSUCCESS:                    MainActivity.iv.setImageBitmap((Bitmap) msg.obj);                    break;                }            }        }    }    public void geturl(View v){        /*Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));        startActivity(intent);  */        new Thread(new Runnable() {                        @Override            public void run() {                try {                    URL url=new URL("http://img2.3lian.com/img2007/10/28/123.jpg");                    InputStream in=url.openStream();                    Bitmap bitmap=BitmapFactory.decodeStream(in);                    Message message= handler.obtainMessage(LOADSUCCESS, bitmap);                    handler.sendMessage(message);                } catch (MalformedURLException e) {                    // TODO 自动生成的 catch 块                    e.printStackTrace();                } catch (IOException e) {                    // TODO 自动生成的 catch 块                    e.printStackTrace();                }            }        }).start();            }}

 

  相关解决方案