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();
            
        }
    
    }
  • 相关阅读:
    Leetcode Excel Sheet Column Number
    AlgorithmsI PA2: Randomized Queues and Deques Subset
    AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue
    AlgorithmsI PA2: Randomized Queues and Deques Deque
    AlgorithmsI Programming Assignment 1: PercolationStats.java
    hdu多校第四场 1003 (hdu6616) Divide the Stones 机智题
    hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
    hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到
    hdu多校第三场 1007 (hdu6609) Find the answer 线段树
    hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
  • 原文地址:https://www.cnblogs.com/hyyweb/p/5202621.html
Copyright © 2011-2022 走看看