zoukankan      html  css  js  c++  java
  • 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();
            
        }
    
    }
  • 相关阅读:
    牛客网 剑指Offer JZ19 顺时针打印矩阵
    牛客网 剑指Offer Z18 二叉树的镜像
    牛客网 剑指Offer JZ17 树的子结构
    一键安装脚本(MySQL双主、EMQX集群、FastDFS集群)
    API和拦截器相关的设计简记
    C# 获取今天,昨天,上周,下周,上月,下月等等一些日期格式
    Element.scrollIntoView()
    自主学习(1)--matlab
    四则运算java
    学习计划
  • 原文地址:https://www.cnblogs.com/hyyweb/p/5202621.html
Copyright © 2011-2022 走看看