2017-08-15 87 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() –