通过intent(事务错误)与重新加载(OOM)传递位图

时间:2015-08-08 21:04:30

标签: android android-intent parse-platform bitmap android-bitmap

这更像是一个设计问题。我有MasterActivity显示的图片预览不是很少,而DetailActivity则应该以全屏显示图片。

使用parse.com服务从服务器检索图片,并将其分配给ParseImageView,即view.setParseFile(file); view.loadInBackground()。平均大小约为。 800x1000px:因此图片在主活动中缩小,细节更大。在这两种情况下,我都会在后端引用相同的800x1000px文件。下载大约需要2秒。我不想存储较小的尺寸。

当用户点击按钮时,我需要将此位图(ParseFile,objectId等)传递给DetailActivity,如果它已加载到MasterActivity

选项1:通过意图分配

问题:活页夹交易失败

Intent i = new Intent(this, DetailActivity.class);
Bitmap b = ((BitmapDrawable) picture.getDrawable()).getBitmap();
i.putExtra("bitmap", b);
startActivity(i);

无法工作,获得Binder Transaction Failed!。在SO(example)上有详细记载,你不能传递大于1MB(或多或少)的对象。

选项2:byte []到Intent

问题:活页夹交易失败

ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
i.putExtra("bitmap", bytes);

正如其他地方所建议的,我试图压缩位图,但我得到了相同的大小错误。为了避免交易限制,我应该将质量降低到50左右,结果不好看。

选项3:在DetailActivity.onCreate()

中再次下载文件

问题:OutOfMemoryError

这是一个很有前途的选择,但没有工作,抛出OOM。我的调试意见是:

  • 我在MasterActivity;
  • 下载图片
  • 我启动DetailActivity,而主人仍在后台;
  • 我下载了第二个图片实例,因此就是OOM。

我已经陷入困境。我能做什么?如果两个活动可以共享相同的Bitmap实例,我可以避免OOM。

0 个答案:

没有答案