java - 在方法中创建弱引用

标签 java android bitmap out-of-memory weak-references

我有以下方法,它有一个用户可以左右滑动的 ImageSwitcher。所选图像显示在屏幕中央。我已经在低内存手机上对高分辨率图像进行了一些图像缩放,但是当从左向右快速滑动时,我仍然遇到位图 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));
}

最佳答案

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。

关于java - 在方法中创建弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915915/

相关文章:

java - 在Java中,PrintStream如何最终将文本打印到控制台?

java - 从文本文件中读取并将用户输入与文本文件中的某些字段列相匹配。列已分隔

javascript - 在 Phaser 中从位图数据加载 spritesheet

java - 接受 URL 作为参数并返回 Java 中的 ImageView

java - 如何按类型从 Arraylist 中删除元素

java - 编写查询来删除 3 分钟内未 ping 服务器的节点

java - Android 计算字母的值

android - mdpi 设备的自定义 dimens.xml - 如何完成?

android - 在按钮的中心点之间画线,找不到中心

C#加载JPG文件,提取BitmapImage