2012-10-16 58 views
1

我有以下方法,它有一個ImageSwitcher,用戶可以左右滑動。所選圖像顯示在屏幕中央。我在低內存手機上對高分辨率圖像進行了一些圖像縮放,但當從左向右快速滑動時,我仍然遇到了Bitmap OutOfMemoryEexception。我想改變行mSwitcher.setImageURI(myUri);(這是導致OOME的行)使用弱引用,以便它可以自動垃圾收集。我怎樣才能做到這一點?這是性能優化此方法的最佳方式嗎?在方法中創建弱引用

感謝

方法:

public void onItemSelected(AdapterView parent, View v, int position, long id) { 

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "MyAppName"); 
    File[] cachedOnSDImages = mediaStorageDir.listFiles(); 
    countArray = new Integer[cachedOnSDImages.length]; 
    fileArray = new String[cachedOnSDImages.length]; 
    fileArray[position] = cachedOnSDImages[position].getAbsolutePath(); 
    Uri myUri = Uri.parse(fileArray[position]); 
    mSwitcher.setImageURI(myUri); // weakly reference myUri in this line 
    this.currentpos = position; 
} 

我要補充的mSwitcher在此實例:

private void makeSwitcher() { 
    mSwitcher = (ImageSwitcher) findViewById(R.id.switcher); 
    mSwitcher.setFactory(this); 
    mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, 
     android.R.anim.fade_in)); 
    mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, 
     android.R.anim.fade_out)); 
} 
+0

[如何在Java和Android中使用WeakReference](https://stackoverflow.com/a/47027492/3681880) – Suragch

回答

4
import java.lang.ref.WeakReference; 

public class ReferenceTest { 
     public static void main(String[] args) throws InterruptedException { 

      WeakReference r = new WeakReference(new String("I'm here")); 
      WeakReference sr = new WeakReference("I'm here"); 
      System.out.println("before gc: r=" + r.get() + ", static=" + sr.get()); 
      System.gc(); 
      Thread.sleep(100); 

      // only r.get() becomes null 
      System.out.println("after gc: r=" + r.get() + ", static=" + sr.get()); 

     } 
} 

wiki Weak references

採取這是多麼的無力引用可以在Java中使用 - 但這也意味着它不會在您的情況下工作,因爲切換器必須顯式接受WeakReference對象而不是URI。

+0

我讀過那個例子。我已添加到mSwitcher實例化的代碼中。每次調用myUrl時,是否可以弱引用或創建一個新的實例? – KDEx

+0

本週的參考資料將幫助你在這種情況下。從本質上講,這也是一個壞主意 - 因爲對象可以隨時被GC殺死。最明智的做法是在uri不再需要時解引用uri--或者將其替換爲新的uri或將該變量設置爲null。此時,URI對象將符合garbarge集合的條件。 – dngfng