2017-08-15 5 views
2

Je crée un référentiel HASHMAP principal pour la mise en cache d'images utilisateur provenant du serveur. ce cache est statique. Ce cache enregistre l'ID utilisateur en tant que clé et tableau d'octets en tant que valeur.got null lors de la création d'un bitmap à partir d'un tableau d'octets

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

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

    return sDrawables; 
} 

J'utilise des AsyncTask pour le téléchargement des images à partir du serveur et de mettre ce tableau d'identité et des images sur hashmap et après cela, je mets cette carte à ma principale hashmap statique:

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

Sur la place que je veux mettre cette image d'utilisateur à mon imageview, j'envoie l'identification d'utilisateur au hashmap principal et après l'avoir trouvé j'obtiens sa valeur et je convertis cette valeur en bitmap. mais bitmap il est pas créé mon bitmap est nulle:

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

Le message

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) 

Mon journal:

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


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

EDIT

Enfin, ce code était correct et j'ai obtenu un bitmap.

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

Répondre

0

Comme vous obtenez l'octet de Asynktask vous devriez essayer de décodage octet avec decodeStream(InputStream is), decodeStream, Décoder un flux d'entrée dans un bitmap au lieu de decodeByteArray(); decodeByteArray, Décode un bitmap immuable du tableau d'octets spécifié.

+0

Je le convertis comme ceci: http://codepad.org/i4KzzJzl et ceci est ma réponse json: http://codepad.org/XVVFM9ia –

+0

parce que ma réponse de json est byte: http://codepad.org/ XVVFM9ia –

+0

Ok, puis obtenir bitmap en essayant decodeStream() .., au lieu de decodeByteArray() –