1. 程式人生 > >Android中的軟引用(SoftRefrerence)和弱引用(WeakReference)

Android中的軟引用(SoftRefrerence)和弱引用(WeakReference)

在Android開發中,基本上很少有用到軟引用或弱引用,這兩個東東若用的很好,對自己開發的程式碼質量的提高有很大的幫助。若用的不好,會坑了自己。所以,在還沒有真正的去了解它們之前,還是慎用比較好。

下面將通過兩個Demo來結識軟引用和弱引用在開發中的運用。

一. WeakReference:防止記憶體洩漏,要保證記憶體被虛擬機器回收。

        下面以一個時間更新的Demo來說明弱引用的運用。

         1. main.xml檔案程式碼如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <
    LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical">
  6.     <com.stevenhu.wrt.DigitalClock
  7.         android:layout_width="match_parent"
  8.         android:layout_height
    ="match_parent"
  9.         android:orientation="horizontal">
  10.         <TextViewandroid:id="@+id/time"
  11.             android:layout_width="wrap_content"
  12.             android:layout_height="wrap_content"
  13.             android:textSize="50pt"
  14.             />
  15.         <TextViewandroid:id="@+id/ampm"
  16.             android:layout_width="wrap_content"
  17.             android:layout_height="wrap_content"
  18.             android:textSize="25pt"
  19.             />
  20.     </com.stevenhu.wrt.DigitalClock>
  21. </LinearLayout>
       2.自定義ViewGroup類DigitalClock的程式碼如下:
  1. package com.stevenhu.wrt;  
  2. import java.lang.ref.WeakReference;  
  3. import java.text.DateFormatSymbols;  
  4. import java.util.Calendar;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.IntentFilter;  
  9. import android.database.ContentObserver;  
  10. import android.graphics.Canvas;  
  11. import android.os.Handler;  
  12. import android.provider.Settings;  
  13. import android.text.format.DateFormat;  
  14. import android.util.AttributeSet;  
  15. import android.view.View;  
  16. import android.widget.LinearLayout;  
  17. import android.widget.TextView;  
  18. import android.widget.Toast;  
  19. publicclass DigitalClock extends LinearLayout {  
  20.     // 12小時、24小時制
  21.     privatefinalstatic String M12 = "h:mm";  
  22.     privatefinalstatic String M24 = "kk:mm";  
  23.     private Calendar mCalendar;  
  24.     private String mFormat;  
  25.     private TextView mDislpayTime;  
  26.     private AmPm mAmPm;  
  27.     private ContentObserver mFormatChangeObserver;  
  28.     privatefinal Handler mHandler = new Handler();  
  29.     private BroadcastReceiver mReceiver;  
  30.     private Context mContext;  
  31.     public DigitalClock(Context context, AttributeSet attrs) {  
  32.         super(context, attrs);  
  33.         mContext = context;  
  34.         // TODO Auto-generated constructor stub
  35.     }  
  36.     @Override
  37.     protectedvoid onFinishInflate() {  
  38.         // TODO Auto-generated method stub
  39.         super.onFinishInflate();  
  40.         mDislpayTime = (TextView) this.findViewById(R.id.time);  
  41.         mAmPm = new AmPm(this);  
  42.         mCalendar = Calendar.getInstance();  
  43.         //設定時間顯示格式
  44.         setDateFormat();  
  45.     }  
  46.     @Override
  47.     protectedvoid onAttachedToWindow() {  
  48.         // TODO Auto-generated method stub
  49.         super.onAttachedToWindow();  
  50.         //動態註冊監聽時間改變的廣播
  51.         if (mReceiver == null) {  
  52.             mReceiver = new TimeChangedReceiver(this);  
  53.             IntentFilter filter = new IntentFilter();  
  54.             filter.addAction(Intent.ACTION_TIME_TICK);  
  55.             filter.addAction(Intent.ACTION_TIME_CHANGED);  
  56.             filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);  
  57.             mContext.registerReceiver(mReceiver, filter);  
  58.         }  
  59.         //註冊監聽時間格式改變的ContentObserver
  60.         if (mFormatChangeObserver == null) {  
  61.             mFormatChangeObserver = new FormatChangeObserver(this);  
  62.             mContext.getContentResolver().registerContentObserver(  
  63.                     Settings.System.CONTENT_URI, true, mFormatChangeObserver);  
  64.         }  
  65.         //更新時間
  66.         updateTime();  
  67.     }  
  68.     @Override
  69.     protectedvoid onDetachedFromWindow() {  
  70.         // TODO Auto-generated method stub
  71.         super.onDetachedFromWindow();  
  72.         if (mReceiver != null) {  
  73.             mContext.unregisterReceiver(mReceiver);  
  74.         }  
  75.         if (mFormatChangeObserver != 

    相關推薦

    Android引用(SoftRefrerence)引用(WeakReference)

    在Android開發中,基本上很少有用到軟引用或弱引用,這兩個東東若用的很好,對自己開發的程式碼質量的提高有很大的幫助。若用的不好,會坑了自己。所以,在還沒有真正的去了解它們之前,還是慎用比較好。 下面將通過兩個Demo來結識軟引用和弱引用在開發中的運用。

    Android開發優化方案之引用引用的使用

    物件的引用分為四種級別,為了能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。 本篇主要介紹軟引用和弱引用的使用和區別 一、軟引用:SoftReference 如果一個物件只具有軟引用,那麼如果記憶體空間足夠,垃圾回收器就不會回收它;如

    java引用引用

    在java 中除了基本資料型別之外,其他都是引用資料型別,而引用資料型別又分類四種 強引用 指向通過new得到的記憶體空間的引用叫做強引用,比如 String a = new String(“123”),其中的a就是一個強引用,它指向了一塊記憶體為123的堆空間。平時我們

    Android面試篇之引用引用的區別

    軟引用所指向的物件要進行回收,需要滿足兩個條件: ● 沒有任何強引用 指向 軟引用指向的物件(記憶體中的Person物件) ● JVM需要記憶體時,即在丟擲OOM之前 即SoftReference變相

    引用引用在安卓開發的使用

    用處一:解決Handler可能造成的記憶體洩露。 原因分析:為什麼Handler可能造成記憶體洩露。 當使用內部類(包括匿名類)來建立Handler的時候,Handler物件會隱式地持有一個外部類物件(通常是一個Activity)的引用,不然你怎麼可能通過Handler來操

    JAVA的強引用引用(SoftReference)、引用WeakReference幽靈引用(PhantomReference)

    JAVA語言提供了四種引用型別: 強引用、軟引用(SoftReference)、弱引用(WeakReference)和幽靈引用(PhantomReference),與引用密切相關的,還有一個引用佇列ReferenceQueue。 1、強引用 (1)回收時機:強引用不會被GC

    Android 引用引用的使用分析

    本文目錄 1. 引用型別 Java 語言的引用型別有這幾種 強引用 軟引用 SoftReference 弱引用 WeakReference 強引用只要有被引用,虛擬機器 gc 的時候是不會清理的,我們平時寫的程式碼沒有特別指明什麼引用累心,都

    [Android] Android開發優化之——使用引用引用

    Java從JDK1.2版本開始,就把物件的引用分為四種級別,從而使程式能更加靈活的控制物件的生命週期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。這裡重點介紹一下軟引用和弱引用。如果一個物件只具有軟引用,那麼如果記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體

    Java的強引用引用

    style 關系 term handle ren soft obj jsb false 旭日Follow_24 的CSDN 博客 ,全文地址請點擊: https://blog.csdn.net/xuri24/article/details/81114944 一、強引用

    android 使用handle警告,,存在記憶體洩漏的危險,使用靜態內部類引用的方式解決。

    Handle警告的原因:handle定義為內部類,會持有外部類的引用,如果外部類結束,handle因為執行耗時操作沒有結束,並持有外部類的引用,導致外部類佔用的記憶體不能釋放。 解決辦法:handle定義為靜態內部類,handle對於外部類的元件和方法的操作藉助弱引用來實現。 public

    java引用引用

    /** * 引用處理 * * @作者 light-zhang * @時間 2018年11月9日 * @product mall-utils * @package cc.zeelan.common.retus * @file CatReference.java * */ public

    Java之"強引用引用 引用"

    思考:Java中為何會有引用的概念? 思路:在Java裡,當一個物件M被建立的時候,它就被放在heap裡。當GC執行時,如果發現沒有任何引用指向物件M,M就會被回收,用以騰出記憶體空間。 總結:如果一個物件被回收,需要滿足兩個條件: 沒有任何引用指向它 觸發GC(

    引用引用區別 強引用引用區別

    1.強引用 本章前文介紹的引用實際上都是強引用,這是使用最普遍的引用。如果一個物件具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它。 當記憶體空 間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體

    Java的值傳遞"引用"傳遞

    引言 學習過C語言的同學都很清楚在c中呼叫方法的引數有值傳遞和引用傳遞兩種方式。關於值傳遞和引用傳遞網上有許多的部落格寫的很好,這裡我就不解釋了。附上一篇:值傳遞和引用傳遞。但是使用過Java的同學可能知道,如果我們按照C語言的引數傳遞方式來理解Java中引數傳遞的話,有時候可能會和自己預料的答案有所出入。

    weakref模組引用

    正是因為有引用,物件才會在記憶體中存在。當物件的引用數量歸零後,垃圾回收程式會把物件銷燬。 弱引用不會增加物件的引用數量,引用的目標物件稱為所指物件(referent)。常作快取使用。 一般我門會使用weakref包的集合(WeakKeyDictionary, WeakValueDictionary, W

    引用引用

    強引用是指向記憶體申請一段儲存空間,進行儲存的引用型別的物件的引用,如下建立一個強引用, object obj = new object();obj = 10; 在物件獲得的分配記憶體空間中不僅僅存放了物件的資訊,還存放著該物件被引用的次數。在建立一個強引用時,預設的引用次數為 1,之後每引用一

    IOS學習—強引用(__strong) 引用(__weak)

    在Objective-C的ARC模式中, id obj1 = [[NSObject alloc] init]; 這裡雖然沒有顯示的宣告為__strong,但是Objective-C預設宣告的一個物件就為__strong,即: id obj1 = [[N

    引用引用(__strong__weak)

    初學者乾貨 在OC ARC模式下開發: id objcA =[ [NSObject alloc] init]; 預設宣告的一個物件就為__strong強引用,等價於: id __strong objcA =[ [NSObject alloc] init]; 注:在強引用

    python3學習筆記之 強引用引用

    python中,名字和物件的關聯是強引用的關係,會增加引用計數,進而影響目標物件的生命週期。所以 弱引用就是在保留引用的前提下,不增加計數,不阻止目標被回收。但不是所有的型別都支援弱引用(如 int、str、list、tuple。。。等)這裡要提到解構函式 __del__當物

    C++的物件指標物件引用

    在C++中,可以說明指向類的資料成員和成員函式的指標。    指向資料成員的指標格式如下:    <型別說明符><類名>::*<指標名>    指向成員函式的指標格式如下:    <型別說明符>(<類名>::*<