StrictMode Verwirrung - wie ist dies der falsche Thread?
-
11-10-2019 - |
Frage
Meine Frage:
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): at blah.ImageCache.getFromCache (ImageCache.java:248)
12-18 17: 05: 03,336: DEBUG / StrictMode (2112):
beim blah2 $ LoaderThread $ 1.handleMessage (blah.java:63)
Wichtige Snip-its
Klasse LoaderThread erweitert HandlerThread {
Öffentliche Handler mhandler;
public 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 Anrufen
bitmap = BitmapFactory.decodeFile(fLoc);
Welche scheint auf dem UI-Thread ausgeführt werden, aber es macht keinen Sinn für mich. Sollte dies nicht auf einem Hintergrund-Thread aufgerufen werden, zu werden? Das war das Ziel der Verwendung von HandlerThread nachdem alle ...
Die LoadThread Klasse wird in meinem onCreate (Bündel) erstellt wie diese
LoaderThread loader = new LoaderThread ( "imgLoader")
loader.start ();
und Nachrichten aus dem UI-Thread über die Handler übergeben werden
loader.mHandler.dispatchMessage (loader.mHandler.obtainMessage (args ..));
Ich frage mich, ob dies mit der getInstance Methode zu tun, die statisch ist
public static synchronisiert Imagecache getInstance () {
if (_instance == null) { _instance = new Imagecache (); } Rückkehr _instance; }
Lösung
ich wie ein Esel fühle mich jetzt, aber ich rufe die falsche Methode auf meinem Handler ...
die falsche Art und Weise
loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..));
der richtige Weg,
loader.mHandler.sendMessage(loader.mHandler.obtainMessage(args..));
Also irgendwie die Nachrichten über den Handler noch laufen wurden, nur auf dem UI-Thread anstelle des Hintergrund ein.