Ich lade einige Bilder von meinem Server herunter und benutze sie in einer Listview. Nachdem ich bestätigt habe, dass die Bilder tatsächlich heruntergeladen wurden (über einen Dienst), lade ich sie mit BitmapFactory.decodeFile() in ein Bitmap-Objekt. Die Funktion gibt intermittierend null zurück.BitmapFactory.decodeFile gibt null intermittierend zurück
Wenn ich das Fragment aktualisiere, werden Bilder ordnungsgemäß in Bitmap geladen. Ich habe das meistens nach dem ersten Download beobachtet, obwohl das nicht konsistent ist. Falls das Bild bereits heruntergeladen wurde, wird dies manchmal beobachtet. Hier
ist der Code Ich verwende:
@Override
public void run() {
while (!downImageFile.exists()) {
try {
Thread.sleep(1000); // Waits for 1 second (1000 milliseconds)
} catch (InterruptedException e) {
Log.e(LOG_TAG, "Exception", e);
}
}
Log.v(LOG_TAG,"Image downloaded now "+downImageFile.getAbsolutePath());
//String updateWords = updateAuto(); // make updateAuto() return a string
imageView.post(new Runnable() {
@Override
public void run() {
Bitmap bm = BitmapFactory.decodeFile(downImageFile.getAbsolutePath());
if(bm==null){
Log.v(LOG_TAG,"Buzz image is null. Size is "+downImageFile.length()+" "+downImageFile.getAbsolutePath());
}
imageView.setImageBitmap(bm);
}
imageView.setVisibility(View.VISIBLE);
});
}
Hier sind die entsprechenden Protokolle:
11-08 01:32:41.290 32245-32245/com.halobee.main D/skia: --- decoder->decode returned false
11-08 01:32:41.290 32245-32245/com.halobee.main V/BeaconCustomList: Buzz image is null. Size is 255458 /data/user/0/com.halobee.main/files/buzz/hbuzz_b251149098404ebeb1198a5ac03087af20161107110912.jpg
Dies kann kein OutOfMemory Problem sein, da keine derartigen Protokolle gedruckt werden und das Problem ist, wechselnd. Ich habe die Dateigröße nur gedruckt, um ihre Existenz zu bestätigen, und es ist auch ein gültiger Wert. Darüber hinaus ist das Problem bei einigen Geräten und nicht bei allen Geräten reproduzierbar. Ich lade das Bild in einem separaten Thread und nicht auf dem Hauptthread.
Ähm, diese 'while' Schleife ist gruselig. Nur weil die Datei * existiert * heißt das nicht, dass die Datei * komplett geschrieben * wird. Verwenden Sie einen Ereignisbus oder etwas, damit der Dienst die UI-Ebene benachrichtigt, wenn das Bild heruntergeladen und vollständig gespeichert wurde. – CommonsWare
Diese Zeile 'while (! DownImageFile.exists())' prüft, ob eine Datei existiert, gibt es irgendeine Garantie, dass alle Bytes des Bildes in die Datei geschrieben wurden, bevor sie die while-Schleife unterbricht und versucht, sie zu entschlüsseln? –
Wenn dies asynchron gehandhabt wird, sollte keine Schleife erforderlich sein, da das Blockieren kein Problem ist, da Sie nicht im Hauptthread sind. –