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));
}
4

1 回答 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 中可以使用弱引用的方式 - 但这也意味着它在您的情况下不起作用,因为切换器必须显式接受 WeakReference 对象而不是 URI。

于 2012-10-16T13:39:38.270 回答