gpt4 book ai didi

java - 异常 - 无法从资源中找到可绘制的图标

转载 作者:行者123 更新时间:2023-11-30 04:57:42 25 4
gpt4 key购买 nike

背景

大家好。我正在制作一个应用程序,它有一个主要 Activity 和一个自定义对象列表。每个项目显示一张图片、一个标题和一个副标题,所有这些都取自该项目的对象属性。

在应用程序的第一个版本中,当一个项目被点击时,对象被作为 Parcelable 和一个 Intent 发送到另一个 Activity ,它显示了所有属性对象有,包括图像。当时图片的属性只有图片的Resources ID,所以我只需要加载那个ID的图片即可。

在我当前的版本中,我添加了一个新 Activity ,允许用户设置对象信息以便将新对象添加到主 Activity 列表中。但是,用户从图库中选择图像。为了面对这种情况,我将初始 ID 属性更改为 Drawable,这样我就可以直接分配 Resources 图片和 Gallery 挑选的图片。
这给了我一个 FAILED BINDER TRANSACTION 错误,所以我决定将图像保存为 byte[] 以避免这种情况。

现状和问题

我的自定义对象构造函数获取 Drawable 并使用以下方法将其转换为 byte[]:

private byte[] drawableToBytes(Drawable img)
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();

((BitmapDrawable)img).getBitmap().compress(Bitmap.CompressFormat.PNG, 50, stream);

return stream.toByteArray();
}

为了从 Parcelable 中获取对象,我使用了以下方法:

public CentroMando(Parcel in)
{
String[] datos = new String[11];

in.readStringArray(datos);

this.setAbreviatura(datos[0]);
this.setNombre(datos[1]);
this.setImagenBytes(Base64.decode(datos[2], Base64.DEFAULT)); // <----- Image
this.setLugar(new Lugar(datos[3],
Double.parseDouble(datos[4]),
Double.parseDouble(datos[5]),
Double.parseDouble(datos[6])));
this.setComandante(datos[7]);
this.setEnlaceCentroMando(datos[8]);
this.setEnlaceLocalizacion(datos[9]);
this.setEnlaceComandante(datos[10]);
}

将对象转换为Parcelable:

public void writeToParcel(Parcel dest, int flags)
{
dest.writeStringArray(new String[]
{
this.getAbreviatura(),
this.getNombre(),
Base64.encodeToString(this.getImagenBytes(), Base64.DEFAULT), // <----- Image
this.getLugar().getNombre(),
String.valueOf(this.getLugar().getLatitud()),
String.valueOf(this.getLugar().getLongitud()),
String.valueOf(this.getLugar().getDireccion()),
this.getComandante(),
this.getEnlaceCentroMando(),
this.getEnlaceLocalizacion(),
this.getEnlaceComandante()
});
}

要从 byte[] 获取 Drawable,我使用以下代码:

public Drawable getImagenBytesDrawable()
{
byte[] datosBitmap = this.getImagenBytes();

Bitmap imagenBitmap = BitmapFactory.decodeByteArray(datosBitmap, 0, datosBitmap.length);

return new BitmapDrawable(imagenBitmap);
}

现在,当我单击 ListView 中的项目时,一些加载没有任何问题并且显示图像和属性正常,但其余的关闭应用程序,Logcat 上没有任何错误。我必须删除 Logcat 中的过滤器才能真正找到问题:

2019-11-14 01:33:18.287 2110-14522/? E/ActivityManager: Transaction too large, intent: Intent { cmp=com.example.ud4_propuesto_1/.DatosCentroMandoActivity (has extras) }, extras size: 594808, icicle size: 0
2019-11-14 01:33:18.287 2110-14522/? D/GamePkgDataHelper: notifyAppCreate(), pkgName: com.example.ud4_propuesto_1, sendRet: true
2019-11-14 01:33:18.287 2110-12153/? D/GamePkgDataHelper: getGamePkgData(). com.example.ud4_propuesto_1
2019-11-14 01:33:18.287 2110-12153/? D/GameManagerService: handleMessage(), MSG_APP_CREATE. ignore. pkgName: com.example.ud4_propuesto_1
2019-11-14 01:33:18.289 2110-14522/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 598680)
2019-11-14 01:33:18.289 2110-14522/? E/ActivityManager: Second failure launching com.example.ud4_propuesto_1/.DatosCentroMandoActivity, giving up
android.os.TransactionTooLargeException: data parcel size 598680 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:1145)
at android.app.IApplicationThread$Stub$Proxy.scheduleTransaction(IApplicationThread.java:1897)
at android.app.servertransaction.ClientTransaction.schedule(ClientTransaction.java:129)
at com.android.server.am.ClientLifecycleManager.scheduleTransaction(ClientLifecycleManager.java:47)
at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1862)
at com.android.server.am.ActivityStackSupervisor.attachApplicationLocked(ActivityStackSupervisor.java:1199)
at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:10029)
at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:10097)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:170)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:4162)
at android.os.Binder.execTransact(Binder.java:739)
2019-11-14 01:33:18.290 2110-14522/? I/ActivityManager: Process com.example.ud4_propuesto_1 (pid 25813) has died: fore TOP (214,2655)

附加信息

我将 Drawable 图像保存为 xxxhdpi
导致应用程序崩溃的项目图像大小分别为 410 KB、393 KB 和 393 KB。其余图像重量小于 345 KB。
我测试过,只有带有较重图像的项目才会导致应用程序崩溃。

问题

有什么办法可以解决吗?

最佳答案

Intent 的总大小限制为 1MB,因此无法在其中发送位图。

您应该让您的数据对象接受从预设(可绘制资源)或图库(缓存文件的 URL?)中选取的图像,然后解析它并相应地加载图像。

关于java - 异常 - 无法从资源中找到可绘制的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847800/

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