StrictMode confusion - comment est-ce le mauvais fil?
-
11-10-2019 - |
Question
Ma question:
12-18 17: 05: 03,336: DEBUG / StrictMode (2112): StrictMode violation de la politique; ~ Durée = 2073 ms: android.os.StrictMode $ StrictModeDiskReadViolation: politique = 23 violation = 2
A partir de la méthode de l'usine
12-18 17: 05: 03,336: debug / StrictMode (2112): à android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:299)
Alors dans mon code
12-18 17: 05: 03,336: Debug / StrictMode (2112): à blah.ImageCache.getFromCache (ImageCache.java:248)
12-18 17: 05: 03,336: DEBUG / StrictMode (2112):
à blah2 $ LoaderThread $ 1.handleMessage (blah.java:63)
snip-son importante
étend la classe LoaderThread HandlerThread {
publique Handler mHandler;
LoaderThread publique (String name) { super (nom); }
@Override onLooperPrepared () {publique vide mHandler = new Handler () { handleMessage public void (message msg) { Bitmap bit = ImageCache.getInstance () getFromCache ((String) msg.obj, ImageCache.USE_DISK). } }; } }
La méthode getFromCache dans les appels de classe ImageCache
bitmap = BitmapFactory.decodeFile(fLoc);
Ce qui semble être en cours d'exécution sur le thread d'interface utilisateur, mais il fait aucun sens pour moi. Devrait pas être se fait appel à un fil de fond? Tel était le but d'utiliser HandlerThread après tout ...
La classe LoadThread est créé dans mon onCreate (bundle) comme celui-ci
LoaderThread loader = new LoaderThread ( "imgLoader")
loader.start ()
et les messages sont transmis à partir du fil de l'interface utilisateur par l'intermédiaire du gestionnaire
loader.mHandler.dispatchMessage (loader.mHandler.obtainMessage (args ..));
Je me demande si cela a à voir avec la méthode getInstance qui est statique
static synchronisée ImageCache getInstance () {
if (_instance == NULL) { _instance = new ImageCache (); } retourner _instance; }
La solution
Je me sens comme un âne maintenant, mais j'appelle la mauvaise méthode sur mon gestionnaire ...
dans le mauvais sens
loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..));
le droit chemin
loader.mHandler.sendMessage(loader.mHandler.obtainMessage(args..));
Alors en quelque sorte les messages étaient en cours d'exécution par le gestionnaire encore, juste sur le thread d'interface utilisateur au lieu de l'arrière-plan.