Mein Problem:StrictMode Verwirrung - wie ist das der falsche Thread?
12-18 17: 05: 03,336: DEBUG/StrictMode (2112): StrictMode Richtlinienverletzung; ~ Dauer = 2.073 ms: android.os.StrictMode $ StrictModeDiskReadViolation: Politik = 23 Verletzung = 2
Von der Factory-Methode
12-18 17: 05: 03,336: DEBUG/StrictMode (2112): bei android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:299)
Dann in meinem Code
12-18 17: 05: 03,336: DEBUG/StrictMode (2112): bei blah.ImageCache.getFromCache (ImageCache.java:248)
12-18 17: 05: 03,336: DEBUG/StrictMode (2112):
bei blah2 $ LoaderThread $ 1.handleMessage (blah.java:63)
Wichtige snip-its
Klasse LoaderThread erweitert HandlerThread {
öffentlicher Handler mHandler;
öffentliche LoaderThread (String-Name) { Super (Name); }
@Override public void onLooperPrepared() { mhandler = new Handler() { public void handle (Message msg) { Bitmap-Bit = ImageCache.getInstance(). GetFromCache ((String) msg.obj , ImageCache.USE_DISK); } }; } }
Die getFromCache Methode in der Klasse Imagecache ruft
bitmap = BitmapFactory.decodeFile(fLoc);
, die auf dem UI-Thread zu laufen scheint, aber es macht keinen Sinn für mich. Sollte dies nicht auf einem Hintergrund-Thread aufgerufen werden? Das war das Ziel der Verwendung HandlerThread nachdem alle ...
Die LoadThread Klasse in meinem onCreate (Bündel) erstellt wird, wie diese
LoaderThread loader = new LoaderThread ("imgLoader")
loader .Anfang();
und Nachrichten werden von dem UI-Thread über den Handler übergeben
loader.mHandler.dispatchMessage (loader.mHandler.obtainMessage (args ..));
Ich frage mich, ob dies mit der getInstance Methode zu tun hat, die
public static synchronisiert Imagecache getInstance() statisch ist {
if (_instance == null) { _instance = neuer ImageCache(); } zurück _instance; jetzt }
@ smith234: Warum verwenden Sie 'HandlerThread' anstatt nur' AsyncTask'? – CommonsWare
@CommonsWare Ich wollte sehen, wie es beim Laden von Bildern in einer 'ListView' funktioniert. Mit einer 'AsyncTask' müsste ich für jeden Drawable einen neuen erstellen. Mit dem 'HandlerThread' kann ich einfach Nachrichten an den Looper senden (der die Datei von der Festplatte lädt und eine Nachricht an den Looper der Benutzeroberfläche zurückschickt, der die fragliche Zeile aktualisieren kann) – smith324