在方法中创建弱引用

3
我有一个方法,其中包含一个可以让用户左右滑动的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));
}

如何在Java和Android中使用WeakReference - Suragch
1个回答

5
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
这就是Java中如何使用弱引用 - 然而这也意味着它在你的情况下无法工作,因为switcher必须明确接受一个WeakReference对象而不是一个URI。

我已经阅读了那个示例。我已经在我的代码中添加了mSwitcher实例化的部分。每次调用myUrl时,是否可以弱引用或创建一个新的实例? - KDEx
弱引用将在这种情况下对您有所帮助。本质上,这也是一个不好的想法 - 因为对象可以随时被GC杀死。最明智的做法是在不再需要uri时取消引用它 - 通过将其替换为新的uri或将变量设置为null。此时,URI对象将有资格进行垃圾回收。 - dngfng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接