2010-12-18 2 views
3

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 }

+0

@ smith234: Warum verwenden Sie 'HandlerThread' anstatt nur' AsyncTask'? – CommonsWare

+0

@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

Antwort

3

ich wie ein Esel fühlen, aber ich war die falsche Methode auf meinem Handler Aufruf ...

der falsche Weg

loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..)); 

der richtige Weg

loader.mHandler.sendMessage(loader.mHandler.obtainMessage(args..)); 

Also irgendwie wurden die Nachrichten durch den Handler immer noch nur auf dem UI-Thread anstelle des Hintergrunds ausgeführt.

+2

Dies bedeutet, dass' StrictMode' die gewünschten Funktionen erfüllen konnte Ziel, indem Sie ein potenzielles Problem in Ihrem Programm signalisieren, das Sie beheben konnten. :) –

+0

@Jean Hominal das ist richtig! Ich habe es genossen, 'StrictMode' zu ​​verwenden, um diese Probleme zu finden, diese hat mich aber nur einen Kurvenball geworfen. – smith324

Verwandte Themen