zoukankan      html  css  js  c++  java
  • Android学习笔记之SoftReference软引用,弱引用WeakReference

    SoftReference可以用于bitmap缓存

    WeakReference 可以用于handler

     非静态内部类和匿名内部类容易造成内存泄漏

        private Handler mRemoteHandler = new SafeHandler(this);
        private static final int INIT_UI = 1;
    
        /**
         * safe handler 静态内部类
         */
        private static class SafeHandler extends Handler {
            private final WeakReference<MainActivity> mActivitys;
    
            public SafeHandler(MainActivity preview) {
                mActivitys = new WeakReference<MainActivity>(preview);
            }
    
            @Override
            public void handleMessage(Message msg) {
                MainActivity activity = mActivitys.get();
                if (activity != null) {
                    if (null != msg) {
                        switch (msg.what) {
                            case INIT_UI:
                                activity.initView();
                                activity.updateUI();
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        }
    
    
    import android.os.AsyncTask;
    import android.text.TextUtils;
    
    import com.roadrover.settings.network.NetSupplier;
    import com.roadrover.settings.network.NetworkBean;
    import com.roadrover.utils.Logcat;
    
    import java.lang.ref.WeakReference;
    import java.util.Arrays;
    
    /**
    不是内部类
     */
    public class HotSpotSafeTask extends AsyncTask<Void, Void, String[]> {
        // 弱引用允许Activity被垃圾收集器清理
        private final WeakReference<HotSpotFragment> weakFragment;
    
        public HotSpotSafeTask(HotSpotFragment fragment) {
            this.weakFragment = new WeakReference<>(fragment);
        }
    
        @Override
        public String[] doInBackground(Void... params) {
            // do async stuff here
            // 重新获取Fragment的强引用,并且判断是否存活
            HotSpotFragment fragment = weakFragment.get();
            if (fragment == null || fragment.isDetached()) {
                // Fragment死亡了,不再做任何的事情
                return null;
            }
            String[] config = fragment.getWifiApConfig();
            return config;
        }
    
        @Override
        public void onPostExecute(String[] config) {
            // 重新获取Fragment的强引用,并且判断是否存活
            HotSpotFragment fragment = weakFragment.get();
            if (fragment == null || fragment.isDetached()) {
                // Fragment死亡了,不再做任何的事情
                return;
            }
            // The Fragment is still valid, do main-thread stuff here
            if ((config != null) && (config.length == 3)) {
                if (null != fragment) {
                    Logcat.d("getWifiApConfig " + Arrays.toString(config));
                    fragment.setName(config[0]);
                    if (!TextUtils.isEmpty(config[1])) {
                        fragment.setPassword(config[1]);
                    } 
                }
            }
    
        }
    }
  • 相关阅读:
    Eclipse 代码提示功能设置。
    eclipse android 查看源文件 出错的解决办法
    Android 中自定义控件和属性(attr.xml,declarestyleable,TypedArray)的方法和使用
    android屏幕尺寸 sp,px,dp,density,in介绍
    用C#实现的条形码和二维码编码解码器 之转载
    在Eclipse下如何导入jar安装包
    C# 获取往控件中拖进的文件或文件夹的信息(转)
    c#中Dictionary、ArrayList、Hashtable和数组的区别是什么?[转]
    C#中的枚举
    C#结构体特性
  • 原文地址:https://www.cnblogs.com/lipeineng/p/6904139.html
Copyright © 2011-2022 走看看