在Android中使用字节数组和位图时如何避免OOM

时间:2018-08-02 08:45:22

标签: java android android-glide

我正在制作一个简单的Android聊天应用程序,可以发送图像和文本。我暂时在localhost中使用MySQL数据库,在其中存储图像的base64字符串(我需要这样做,因为我也必须在网络版本的聊天中显示图像)。到目前为止,网络版本可以正常运行,但是我的Android应用每发送2-3张图片就会运行到OOM中。

这是我的代码,用于将base64转换为位图并使用Glide显示,将其放入RecyclerView适配器中以显示聊天中发送的图像:

byte[] decodedString = Base64.decode(c.getMessage(), Base64.DEFAULT);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inSampleSize=16;
decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length,options);
Glide.with(viewHolder.mymessageImage.getContext())
                        .asBitmap()
                        .load(decodedString)
                        .thumbnail(0.5f)
                        .into(viewHolder.mymessageImage);
decodedString=null;

这些是我得到的错误:

E/dalvikvm-heap: Out of memory on a 4205580-byte allocation.
E/GlideExecutor: Request threw uncaught throwable java.lang.OutOfMemoryError

我之所以使用Glide,是因为以前是

viewHolder.mymessageImage.setImageBitmap(decodedByte);

以显示图像,它也导致OOM。我直接设置ImageBitmap时的错误是

处的OOM
byte[] decodedString = Base64.decode(c.getMessage(), Base64.DEFAULT);

行。经过一番谷歌搜索后,很多人说滑翔将是解决方案。 Glide确实有助于提高加载速度,但在发送2-3张图片并上下滚动RecyclerView数次后,它仍因OOM而崩溃。

我已尝试将这个问题修复了一周,但都无济于事。我正在考虑这个问题。请帮助我找到一种解决方案,以使我的应用在没有OOM的情况下平稳运行。

0 个答案:

没有答案