2017-08-15 65 views
2

我创建了一个用于缓存来自服务器的用户图像的主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和在此之后,我把这个地图我的主静的HashMap:

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

在地方我想将此用户图像设置为我的图像视图,我将用户标识发送给主散列图,找到它后,我得到它的值,并将此值转换为位图。但其位不创建我的位图是空:

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); 
     } 

回答

0

正如你从Asynktask越来越字节,你应该尝试与decodeStream(InputStream is)解码字节,decodeStream,解码输入流成位图,而不是decodeByteArray(); decodeByteArray,解码来自指定字节数组的不可变位图。

+0

我把它转换成这样:http://codepad.org/i4KzzJzl这是我的回复json:http://codepad.org/XVVFM9ia –

+0

因为我的json响应是字节:http://codepad.org/ XVVFM9ia –

+0

好吧然后获取位图与尝试decodeStream()..,而不是decodeByteArray() –