如何快速将位图从活动传递到另一个?

时间:2019-02-22 13:28:25

标签: java android android-intent android-activity bitmap

我试图将一个活动的位图传递给另一个,我尝试了多种解决方案,但它们的速度不够快。

当前我正面临这个问题:当我单击下一个按钮时,它冻结2秒钟,然后移动到具有ImageView中显示的正确位图的下一个活动。

我在StackoverFlow中找到了这个解决方案。这是代码:

throw std::runtime_error("Can not divide by zero!!");

然后,我首先尝试将文件保存在辅助线程中,然后单击下一个按钮进行检索,现在它的工作速度很快,但是我得到了错误的位图。

这是代码:

std::invalid_argument

在第二个活动中,我以这种方式检索位图:

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

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

只需将图像uri传递到下一个活动即可。从uri中加载其他活动。

答案 1 :(得分:1)

  1. 创建琐碎的Service。给那个Service一个public Bitmap mBitmap成员。
  2. ActivityService之间,绑定到onStart()的每个onStop()
  3. 如果您的Activities引用了Service,则他们可以直接通过mBitmap成员进行交流。一个Activity可以设置mBitmap,然后启动另一个Activity。第二个Activity可以简单地获取引用(当然是在绑定之后),然后开始操纵Bitmap。由于一切都发生在UI线程上,因此没有同步问题。一切都很快。

此解决方案无法解决持久性问题:如果用户离开应用程序一段时间(将其置于背景,锁定屏幕等),则整个应用程序可能会被破坏,并且{{1} }将会丢失。但是,如果您只是想在两个连续的mBitmap之间共享数据,这是一种简单的方法。

您甚至可以通过放置在任何方便类中的Activities引用来共享Bitmap。有谣言说垃圾回收器会一时兴起地将public static引用设置为static,但这是对实际行为的误解:整个应用程序可能会在意外的时间清理。当您返回到null时,系统实际上可能必须重新启动应用程序并从头开始创建Activity。在这种情况下,引用将重置为Activity

相反,使用null向OS表示您的应用程序组件应具有更长的寿命。当然,它会继续存在于两个连续Service之间的间隙中。

请注意,在Oreo及更高版本上,系统在清除应用程序时会非常积极地清理它们。