Как быстро передать растровое изображение из действия в другое? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь передать растровое изображение из действия в другое, я пробовал несколько решений, но они не достаточно быстрые.

В настоящее время я сталкиваюсь с этой проблемой: когда я нажимаю следующую кнопку, онаостанавливается на 2 секунды, затем переходит к следующему действию с правым растровым изображением, показанным в ImageView.

Я нашел это решение в StackoverFlow.Вот код:

  Uri imageUri = intent.getParcelableExtra("URI");
        if (imageUri != null) {
            imageView.setImageURI(imageUri);
            try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(this, "No image is set to show", Toast.LENGTH_LONG).show();
        }

  btn_next_process.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (bitmap == null) {
                Toast.makeText(CropResultActivity.this, "Emptyyy", Toast.LENGTH_SHORT).show();
            }
            else {
                try {
                    //Write file
                    String filename = "bitmap.png";
                    FileOutputStream stream = CropResultActivity.this.openFileOutput(filename, Context.MODE_PRIVATE);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);

                    //Cleanup
                    stream.close();
                  //  bitmap.recycle();

                    //Pop intent
                    Intent in1 = new Intent(CropResultActivity.this, InputProcessingActivity.class);
                    in1.putExtra("image_data", filename);
                    startActivity(in1);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    });

Затем я сначала попытался сохранить файл в рабочем потоке, и когда я нажимаю следующую кнопку, я получаю его, теперь он работает быстро, но я получаю неправильный битовый образ.

Вот код:

  Uri imageUri = intent.getParcelableExtra("URI");
        if (imageUri != null) {
            imageView.setImageURI(imageUri);
            try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);

                new Thread() {
                    @Override
                    public void run() {
                        try {
                            //Write file
                            FileOutputStream stream = CropResultActivity.this.openFileOutput(filename, Context.MODE_PRIVATE);
                            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                            //Cleanup
                            stream.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }.run();

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(this, "No image is set to show", Toast.LENGTH_LONG).show();
        }

  btn_next_process.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (bitmap == null) {
                Toast.makeText(CropResultActivity.this, "Empty", Toast.LENGTH_SHORT).show();
            }
            else {
                //Pop intent
                Intent in1 = new Intent(CropResultActivity.this, InputProcessingActivity.class);
                in1.putExtra("image_data", filename);
                startActivity(in1);
            }
        }
    });

Во втором упражнении я получаю растровое изображение следующим образом:

  private void getIncomingIntent(){
    if(getIntent().hasExtra("image_data")){
        try {
            String filename = getIntent().getStringExtra("image_data");
            FileInputStream is = this.openFileInput(filename);
            imageToProcess = BitmapFactory.decodeStream(is);
            process_detect_edges(imageToProcess);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019
  1. Создать тривиальный Service.Дайте этому Service a public Bitmap mBitmap члену.
  2. Держите каждого Activity привязанным к Service, пока они находятся между onStart() и onStop().
  3. Если ваш Activities имеют ссылку на Service, они могут общаться напрямую через mBitmap участника.Один Activity может установить mBitmap, затем запустить другой Activity.Второй Activity может просто захватить ссылку (после связывания, конечно) и начать манипулировать Bitmap.Поскольку все происходит в потоке пользовательского интерфейса, проблем синхронизации нет.И все довольно быстро.

Это решение не решает проблемы постоянства: если пользователь покидает приложение на некоторое время (помещает его в фоновый режим, блокирует экран и т. Д.), Товсе приложение может быть уничтожено, а mBitmap будет потеряно.Однако, если вы просто пытаетесь обмениваться данными между двумя последовательными Activities, это простой способ сделать это.

Вы можете даже поделиться Bitmap через ссылку public static, размещенную влюбой удобный класс.Ходят слухи, что сборщик мусора пытается установить static ссылки на null по какой-то прихоти, но это неверное толкование фактического поведения: что все приложение может быть очищено в неожиданное время.Когда вы вернетесь к Activity, системе, возможно, придется перезапустить приложение и воссоздать Activity с нуля.В этом случае ссылка будет сброшена на null.

Вместо этого использование Service указывает ОС, что у вас есть компонент вашего приложения, который должен быть немного более долговечным.Конечно, он будет продолжать существовать через промежуток между двумя последовательными Activities.

Обратите внимание, что в Oreo и более поздних версиях система может быть довольно агрессивной в отношении очистки приложений, как только они выходят на передний план.

0 голосов
/ 22 февраля 2019

Просто передайте изображение URI для следующего действия.Загрузка из URI в другой деятельности.

...