OutOfMemoryError при создании растрового изображения после поворота экрана - PullRequest
0 голосов
/ 15 сентября 2018

Я использую PhotoView для отображения изображений в моем приложении, но когда я поворачиваю устройство 3 или 4 раза, я получаю ошибку OutOfMemory, в чем проблема?правильно чистить PhotoView?

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // Get intent, action and MIME type
        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();

        if (Intent.ACTION_SEND.equals(action) && type != null) {
            if ("text/plain".equals(type)) {
                handleSendText(intent); // Handle text being sent
            } else if (type.startsWith("image/")) {
                handleSendImage(intent); // Handle single image being sent
            }
        } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
            if (type.startsWith("image/")) {
                handleSendMultipleImages(intent); // Handle multiple images being sent
            }
        } else {
            // Handle other intents, such as being started from the home screen
        }


    }



    void handleSendText(Intent intent) {
        String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
        if (sharedText != null) {
            Toast.makeText(this, sharedText, Toast.LENGTH_LONG).show();
        }
    }

    void handleSendImage(Intent intent) {
        Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
        if (imageUri != null) {
            Toast.makeText(this, imageUri.toString(), Toast.LENGTH_LONG).show();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);//OOM here
                PhotoView photoView = (PhotoView) findViewById(R.id.img);
                photoView.setImageBitmap(bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    void handleSendMultipleImages(Intent intent) {
        ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
        if (imageUris != null) {
        }



    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        ((PhotoView)findViewById(R.id.img)).setImageBitmap(null);
        ((PhotoView)findViewById(R.id.img)).setImageDrawable(null);
        ((PhotoView)findViewById(R.id.img)).setImageResource(0);
    }
}

1 Ответ

0 голосов
/ 15 сентября 2018

Иногда просто установить растровое изображение или нарисованное для ImageView на ноль недостаточно.Вам нужно будет явно переработать растровое изображение.

Для этого преобразуйте вашу переменную bitmap в поле (глобальная переменная) и перезапустите ее при уничтожении.

public class MainActivity extends AppCompatActivity {

    private Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...    

Во время загрузкирастровое изображение, загрузите, как показано ниже:

if(bitmap != null) bitmap.recycle();
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);

И, наконец, внутри onDestroy, переработайте растровое изображение следующим образом:

@Override
protected void onDestroy() {
    ((PhotoView)findViewById(R.id.img)).setImageBitmap(null);
    if(bitmap != null) bitmap.recycle();
    super.onDestroy();
}
...