Java 如何快速地将位图从一个活动传递到另一个活动?
我试图将位图从一个活动传递到另一个活动,我尝试了多种解决方案,但速度不够快 目前我面临着这个问题:当我单击“下一步”按钮时,它会冻结2秒钟,然后移动到下一个活动,并在ImageView中显示右位图 我在StackoverFlow中找到了这个解决方案。代码如下: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
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。然后我试着在第二个活动中使用一个静态变量,现在它工作得很好。请原谅我的长时间更新。我会试试你的