Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何快速地将位图从一个活动传递到另一个活动?_Java_Android_Android Intent_Android Activity_Bitmap - Fatal编程技术网

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

Java 如何快速地将位图从一个活动传递到另一个活动?,java,android,android-intent,android-activity,bitmap,Java,Android,Android Intent,Android Activity,Bitmap,我试图将位图从一个活动传递到另一个活动,我尝试了多种解决方案,但速度不够快 目前我面临着这个问题:当我单击“下一步”按钮时,它会冻结2秒钟,然后移动到下一个活动,并在ImageView中显示右位图 我在StackoverFlow中找到了这个解决方案。代码如下: Uri imageUri = intent.getParcelableExtra("URI"); if (imageUri != null) { imageView.setImageURI(im

我试图将位图从一个活动传递到另一个活动,我尝试了多种解决方案,但速度不够快

目前我面临着这个问题:当我单击“下一步”按钮时,它会冻结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();
        }
    }
}

我做错了什么?

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

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

  • 创建一个简单的
    服务
    。给那个
    服务
    一个
    公共位图mBitmap
    成员
  • 当每个
    活动处于
    onStart()
    onStop()之间时,将其绑定到
    服务
  • 如果您的
    活动
    引用了
    服务
    ,它们可以通过
    mBitmap
    成员直接通信。一个
    活动
    可以设置
    mBitmap
    ,然后启动另一个
    活动
    。第二个
    活动
    只需抓取引用(当然是在绑定之后),然后开始操作
    位图
    。由于所有事情都发生在UI线程上,因此不存在同步问题。而且一切都很快
  • 此解决方案不解决持久性问题:如果用户离开应用一段时间(将其置于后台、锁定屏幕等),则整个应用可能会被销毁,并且
    mBitmap
    将丢失。但是,如果您只是想在两个连续的
    活动之间共享数据,这是一种简单的方法

    您甚至可以通过
    公共静态
    引用(放置在任何方便的类中)共享
    位图
    。有传言称垃圾收集器会随意设置
    static
    null
    的引用,但这是对实际行为的误解:整个应用程序可能会在意外时间被清理。当您返回到
    活动时
    ,系统实际上可能需要重新启动应用程序并从头开始重新创建
    活动。在这种情况下,引用将重置为
    null

    相反,使用
    服务
    会向操作系统表明,你的应用程序中有一个组件的寿命应该稍长一点。当然,它将继续存在于两个连续的
    活动之间的间隙中

    请注意,在Oreo和更高版本上,一旦应用程序离开前台,系统就会非常积极地清理它们

  • 创建一个简单的
    服务
    。给那个
    服务
    一个
    公共位图mBitmap
    成员
  • 当每个
    活动处于
    onStart()
    onStop()之间时,将其绑定到
    服务
  • 如果您的
    活动
    引用了
    服务
    ,它们可以通过
    mBitmap
    成员直接通信。一个
    活动
    可以设置
    mBitmap
    ,然后启动另一个
    活动
    。第二个
    活动
    只需抓取引用(当然是在绑定之后),然后开始操作
    位图
    。由于所有事情都发生在UI线程上,因此不存在同步问题。而且一切都很快
  • 此解决方案不解决持久性问题:如果用户离开应用一段时间(将其置于后台、锁定屏幕等),则整个应用可能会被销毁,并且
    mBitmap
    将丢失。但是,如果您只是想在两个连续的
    活动之间共享数据,这是一种简单的方法

    您甚至可以通过
    公共静态
    引用(放置在任何方便的类中)共享
    位图
    。有传言称垃圾收集器会随意设置
    static
    null
    的引用,但这是对实际行为的误解:整个应用程序可能会在意外时间被清理。当您返回到
    活动时
    ,系统实际上可能需要重新启动应用程序并从头开始重新创建
    活动。在这种情况下,引用将重置为
    null

    相反,使用
    服务
    会向操作系统表明,你的应用程序中有一个组件的寿命应该稍长一点。当然,它将继续存在于两个连续的
    活动之间的间隙中


    请注意,在Oreo和更高版本上,一旦应用程序离开前台,系统就会非常积极地清理它们。

    位图也可以打包。为什么不直接通过Intent传递呢?我已经读到,如果在Intent中传递孔位图,随着大小的增加,将得到“java.lang.SecurityException”,这不是最佳做法。位图也是可打包的。为什么不直接通过Intent传递呢?我已经读到,如果在Intent中传递孔位图,随着大小的增加,您将得到“java.lang.SecurityException”,这不是最佳实践。我将尝试您的解决方案并让您不断更新。谢谢,当然可以。很高兴提供帮助。很抱歉发布了一段不完整的代码,但我没有从Uri设置图像,实际上它是一个if-else语句。因此,我尝试将第一个活动中的位图转换为byteArray,我得到了一个TransactionTooLargeException。然后我试着在第二个活动中使用一个静态变量,现在它工作得很好。请原谅我的长时间更新。我会试试你的