StrictMode confusione - come è questo il filo sbagliato?
-
11-10-2019 - |
Domanda
Il mio problema:
12-18 17: 05: 03,336: DEBUG / StrictMode (2112): violazione delle norme StrictMode; ~ Durata = 2073 ms: android.os.StrictMode $ StrictModeDiskReadViolation: politica = 23 violazione = 2
Dal metodo factory
12-18 17: 05: 03,336: DEBUG / StrictMode (2112): a android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:299)
Poi, nel mio codice
12-18 17: 05: 03,336: DEBUG / StrictMode (2112): a blah.ImageCache.getFromCache (ImageCache.java:248)
12-18 17: 05: 03,336: DEBUG / StrictMode (2112):
a blah2 $ LoaderThread $ 1.handleMessage (blah.java:63)
snip-it Importante
class LoaderThread estende HandlerThread {
pubblica Handler mHandler;
LoaderThread pubblico (String name) { super (nome); }
@Override public void onLooperPrepared () { mHandler = new Handler () { handleMessage public void (msg Message) { bit bitmap = ImageCache.getInstance () getFromCache ((String) msg.obj, ImageCache.USE_DISK).; } }; } }
Il metodo getFromCache negli inviti di classe imagecache
bitmap = BitmapFactory.decodeFile(fLoc);
Il che sembra essere in esecuzione sul thread dell'interfaccia utente, ma non ha senso per me. Non dovrebbe questo essere sempre chiamato in un thread in background? Questo è stato l'obiettivo di utilizzare HandlerThread dopo tutto ...
La classe LoadThread viene creato in mia onCreate (bundle) come questo
LoaderThread loader = new LoaderThread ( "imgLoader")
loader.start ();
ed i messaggi sono passati dal thread dell'interfaccia utente tramite il gestore
loader.mHandler.dispatchMessage (loader.mHandler.obtainMessage (args ..));
Mi chiedo se questo ha a che fare con il metodo getInstance che è statico
public static sincronizzato imagecache getInstance () {
if (_instance == null) { _instance = nuovo imagecache (); } tornare _instance; }
Soluzione
mi sento come un asino ora, ma mi stava chiamando il metodo sbagliato sul mio gestore ...
nel modo sbagliato
loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..));
la strada giusta ??p>
loader.mHandler.sendMessage(loader.mHandler.obtainMessage(args..));
Così in qualche modo i messaggi sono stati in esecuzione attraverso il gestore ancora, proprio sul thread UI al posto dello sfondo uno.