我试图将一个活动的位图传递给另一个,我尝试了多种解决方案,但它们的速度不够快。
当前我正面临这个问题:当我单击下一个按钮时,它冻结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();
}
}
}
});
我在做什么错了?
答案 0 :(得分:1)
只需将图像uri传递到下一个活动即可。从uri中加载其他活动。
答案 1 :(得分:1)
Service
。给那个Service
一个public Bitmap mBitmap
成员。Activity
和Service
之间,绑定到onStart()
的每个onStop()
。Activities
引用了Service
,则他们可以直接通过mBitmap
成员进行交流。一个Activity
可以设置mBitmap
,然后启动另一个Activity
。第二个Activity
可以简单地获取引用(当然是在绑定之后),然后开始操纵Bitmap
。由于一切都发生在UI线程上,因此没有同步问题。一切都很快。此解决方案无法解决持久性问题:如果用户离开应用程序一段时间(将其置于背景,锁定屏幕等),则整个应用程序可能会被破坏,并且{{1} }将会丢失。但是,如果您只是想在两个连续的mBitmap
之间共享数据,这是一种简单的方法。
您甚至可以通过放置在任何方便类中的Activities
引用来共享Bitmap
。有谣言说垃圾回收器会一时兴起地将public static
引用设置为static
,但这是对实际行为的误解:整个应用程序可能会在意外的时间清理。当您返回到null
时,系统实际上可能必须重新启动应用程序并从头开始创建Activity
。在这种情况下,引用将重置为Activity
。
相反,使用null
向OS表示您的应用程序组件应具有更长的寿命。当然,它会继续存在于两个连续Service
之间的间隙中。
请注意,在Oreo及更高版本上,系统在清除应用程序时会非常积极地清理它们。