• 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();
            
        }
    
    }
  • 相关阅读:
    TypeScript "this" 隐式具有类型 "any",因为它没有类型注释 'this' implicitly has type 'any' because it does not have a type annotation
    金仓kingbase连接报错The authentication type 10 is not supported. Check that you have configured the sys_hba.conf file to include the client's IP address or subnet
    Spring Security多次登录失败账户锁定详解
    Vue实现页面长时间不操作自动退出
    【Kingbase】数据类型格式化函数
    SpringSecurity使用注解实现匿名访问
    mysql数据库迁移到kingbase数据库上(其他数据库与其类似)
    宝塔面板安装gitlab提示配置错误解决办法
    Java正则校验密码至少包含:字母数字特殊符号中的2种
    RSA Web前端登录账户密码加密传输
  • 原文地址:https://www.cnblogs.com/hyyweb/p/5202621.html
Copyright © 2020-2023  润新知