gpt4 book ai didi

android - 位图分配,使用 BitmapFactory.Options.inBitmap 抛出 IllegalArgumentException

转载 作者:IT老高 更新时间:2023-10-28 23:07:18 26 4
gpt4 key购买 nike

我得到下一个异常:在将 inBitmap 设置为 true 时,解码到现有位图时出现问题

Caused by: java.lang.IllegalArgumentException: Problem decoding into existing bitmap
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:460)
...

有趣的是,相同的代码在不同的地方运行时会失败:

  • API:4.4.2,Nexus 4
  • API:4.3.1,三星 s3

这是我的代码,它是 DevBytes: Bitmap Allocation 中所示的副本视频。

private BitmapFactory.Options options;
private Bitmap reusedBitmap;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final ImageView imageView = (ImageView) findViewById(R.id.image_view);

// set the size to option, the images we will load by using this option
options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inMutable = true;
BitmapFactory.decodeResource(getResources(), R.drawable.img1, options);

// we will create empty bitmap by using the option
reusedBitmap = Bitmap.createBitmap(options.outWidth, options.outHeight, Bitmap.Config.ARGB_8888);

// set the option to allocate memory for the bitmap
options.inJustDecodeBounds = false;
options.inSampleSize = 1;
options.inBitmap = reusedBitmap;

// #1
reusedBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img1, options);
imageView.setImageBitmap(reusedBitmap);

imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

options.inBitmap = reusedBitmap;
// #2
reusedBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img2, options);
imageView.setImageBitmap(reusedBitmap);

}
});
}

  • Nexus 4,在 //#1
  • BitmapFactory.decodeResource() 上崩溃
  • S3,通过 #1 并显示第一个图像,但稍后通过单击 BitmapFactory.decodeResource() 的图像在 //#2 崩溃

几点注意事项:

  • 图片大小相同。我试过 jpgpng。两者都失败。
  • 位图是可变的。
  • 我通过使用这个 canUseForInBitmap 方法进行了检查,如 described here .

问题:

如何正确使用这个inBitmap属性?

如果你遇到这样的问题或者你看到我做了一些愚蠢的事情,请评论/回复。任何帮助将不胜感激。如果您知道任何解决方法,那就太好了。

- 编辑(问题仍未解决)-

很抱歉没有解释我为什么要以这种方式重用位图的原因。 原因是 GC 每次他决定释放内存时都会锁定。
inBitmap 特性应该可以帮助我们重用位图而不分配新的内存,这会导致 GC 清理已经分配的内存。

例如,如果我使用这种常见的方法:

Log.i("my_tag", "image 1");
imageView.setImageResource(R.drawable.img1);
Log.i("my_tag", "image 2");
imageView.setImageResource(R.drawable.img2);
Log.i("my_tag", "image 3");
imageView.setImageResource(R.drawable.img3);

那么这将是 GC 工作:

I/my_tag  ( 5886): image 1
D/dalvikvm( 5886): GC_FOR_ALLOC freed 91K, 2% free 9113K/9240K, paused 15ms, total 15ms
I/dalvikvm-heap( 5886): Grow heap (frag case) to 19.914MB for 11520016-byte allocation
D/dalvikvm( 5886): GC_FOR_ALLOC freed <1K, 1% free 20362K/20492K, paused 13ms, total 13ms
I/my_tag ( 5886): image 2
D/dalvikvm( 5886): GC_FOR_ALLOC freed 11252K, 2% free 9111K/9236K, paused 15ms, total 15ms
I/dalvikvm-heap( 5886): Grow heap (frag case) to 19.912MB for 11520016-byte allocation
D/dalvikvm( 5886): GC_FOR_ALLOC freed <1K, 1% free 20361K/20488K, paused 35ms, total 35ms
I/my_tag ( 5886): image 3
D/dalvikvm( 5886): GC_FOR_ALLOC freed 11250K, 2% free 9111K/9236K, paused 15ms, total 15ms
I/dalvikvm-heap( 5886): Grow heap (frag case) to 19.913MB for 11520016-byte allocation
D/dalvikvm( 5886): GC_FOR_ALLOC freed <1K, 1% free 20361K/20488K, paused 32ms, total 32ms

这超过了 100ms 的锁定主线程!

如果我将 decodeResource() 不带 inBitmap 选项,也会发生同样的事情。所以问题还是悬而未决,如何使用这个属性?

最佳答案

我用模拟的 Nexus 4 尝试了你的代码。
我有默认的 ic_launcher.png 文件,我在 drawable-mdpi 中复制并粘贴了两次(就像我通常做的那样)。我重命名了这两个新文件以匹配您代码中的名称(这样我就可以进行较少的更改)。
当我运行应用程序时,我观察到的情况与您一样。
经过几次不同的尝试后,我决定将新的 png 复制到其他可绘制文件夹 - 所以它们出现在:

  • drawable-hdpi
  • 可绘制的 mdpi
  • drawable-xhdpi
  • drawable-xxhdpi

我运行应用程序,它正在运行!

我不太确定它为什么真的有效,但显然它必须具有正确的屏幕分辨率/密度。

关于android - 位图分配,使用 BitmapFactory.Options.inBitmap 抛出 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22355566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com