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());

        }
}

ウィキから引用 弱い参照

これは、Java で弱参照を使用する方法です。ただし、これは、スイッチャーが URI の代わりに WeakReference オブジェクトを明示的に受け入れる必要があるため、このケースでは機能しないことも意味します。

于 2012-10-16T13:39:38.270 に答える