• 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();
            
        }
    
    }
  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/hyyweb/p/5202621.html
Copyright © 2020-2023  润新知