【问题标题】:got null when creating bitmap from byte array从字节数组创建位图时为空
【发布时间】:2017-08-15 04:59:58
【问题描述】:

我创建了一个主 HASHMAP 存储库,用于缓存来自服务器的用户图像。这个缓存是静态的。此缓存将用户 ID 保存为键,字节数组保存为值。

private static HashMap<String, byte[]> sDrawables;

public static HashMap<String, byte[]> getMapInstance (){
  if (sDrawables == null)
     sDrawables = new HashMap<>();

  return sDrawables;
}

我使用 AsyncTask 从服务器下载图像并将这个 id 和图像数组放在 hashmap 上,然后,我把这个 map 放到我的主要静态 hashmap 中:

for (Map.Entry<String, byte[]> entry : drawables.entrySet()) {
  ImgFactory.getMapInstance().put(entry.getKey(), entry.getValue());
}

在我想将此用户图像设置到我的图像视图的地方,我将用户 ID 发送到主哈希图,找到它后我得到它的值并将这个值转换为位图。但它没有创建位图我的位图为空:

public static Drawable getConfigDrawable(Context context, String name) {
  if (getMapInstance() != null && getMapInstance().containsKey(name)) {
     Log.i("====>", "getConfigDrawable: "+ getMapInstance().containsKey(name));
     byte[] arr = getMapInstance().get(name);
     Bitmap bitmap = BitmapFactory.decodeByteArray(arr, 0, arr.length);

     Log.i("===", "getConfigDrawable: " + bitmap.getHeight());
     return new BitmapDrawable(context.getResources(), bitmap);
  }
  return null;
}

消息

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getHeight()' on a null object reference
                                                                               at safarayaneh.com.anotify.util.ImgFactory.getConfigDrawable(ImgFactory.java:72)
                                                                               at safarayaneh.com.anotify.adapter.NotifyAdapter$1.onComplete(NotifyAdapter.java:201)
                                                                               at safarayaneh.com.anotify.util.ImgFactory$1.onResult(ImgFactory.java:59)
                                                                               at safarayaneh.com.anotify.tasks.GetImageTask.onPostExecute(GetImageTask.java:87)
                                                                               at safarayaneh.com.anotify.tasks.GetImageTask.onPostExecute(GetImageTask.java:21)
                                                                               at android.os.AsyncTask.finish(AsyncTask.java:651)
                                                                               at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                               at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我的日志:

anotify.debug I/====>: getConfigDrawable: true


Log.i("=====", "getConfigDrawable: length:"+ arr.length);
debug I/=====: getConfigDrawable: length: 12090

编辑

最后,这些代码没问题,我得到了一个位图。

     byte[] tmp=new byte[result.getJSONArray("UserImage").length()];
        for(int i=0;i<result.getJSONArray("UserImage").length();i++){
            tmp[i]=(byte)(((int)result.getJSONArray("UserImage").get(i)) & 0xFF);
        }

【问题讨论】:

    标签: android hashmap android-bitmap


    【解决方案1】:

    当您从 Asynktask 获取字节时,您应该尝试使用 decodeStream(InputStream is) ,decodeStream 解码字节,将输入流解码为位图而不是 decodeByteArray(); decodeByteArray , 从指定的字节数组中解码一个不可变的位图。

    【讨论】:

    • 我这样转换它:codepad.org/i4KzzJzl 这是我的响应 json:codepad.org/XVVFM9ia
    • 好的,然后尝试 decodeStream().. 获取位图,而不是 decodeByteArray()
    • 首先我必须将我的 byteArray 图像响应转换为输入流?
    • 试试这个 InputStream myInputStream = new ByteArrayInputStream(myBytes);
    猜你喜欢
    • 2014-02-28
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多