美文网首页Android开发经验谈
android弱引用真的能解决内存泄露吗?

android弱引用真的能解决内存泄露吗?

作者: 1琥珀川1 | 来源:发表于2017-01-12 22:41 被阅读495次

    看到一些文章WeakReference弱引用很多时候帮我们解决内存泄露问题

       Integer integer = new Integer(1);     
       WeakReference<Integer> weakReference = new WeakReference<Integer>(integer);
       Integer teo= weakReference.get();     
       integer=null;       
       System.gc();   
       if(teo==null){        
        Log.d("msg","不是强引用");      
       }else {         
        Log.d("msg","是强引用");    
      }
    

    如上述代码
    最终结果是

    是强引用

    因为我们在调用该代码Integer teo= weakReference.get(); 已使弱引用失去了作用转为了强引用

    在看下面的例子 伪代码

    private class XmlTask extends AsyncTask{
    
    WeakReference<Activity> weakReference;
    
    public XmlTask(Activity activity){
         weakReference = new WeakReference<Activity>(activity);
    }
    
    protected void doInBackground(String... params) {
     //方式1   Activity activity = weakReference.get(); 
        Activity activity = weakReference.get(); 
       if(activity!=null){
           activity.doSomething();
       }
    
    
    //方式 2.  weakReference.get(); 
       if(weakReference.get() != null) {
           weakReference.get().doSomething();
       }
    }
    
    @Override
     void onPostExecute() {
    }
    

    上面的例子举出了两种实现方式在doInBackground中操作activity
    其实上面两种凡是都是有问题的

    1. Activity activity = weakReference.get(); 其实已经使弱引用失去了作用在最开始的例子中已指明
    2. weakReference.get().doSomething(); 可能会出现空指针异常

    /** * Returns the referent of the reference object. * * @return the referent to which reference refers, or {@code null} if the * object has been cleared. */
    public T get() { return getReferent();}

    如果内存被释放将返回空

    综上所述弱引用不能解决线程中对activity操作引起的内存泄露问题

    如有问题欢迎讨论

    相关文章

      网友评论

        本文标题:android弱引用真的能解决内存泄露吗?

        本文链接:https://www.haomeiwen.com/subject/kogorttx.html