StrictModeの混乱 - これはどのように間違ったスレッドですか?
-
11-10-2019 - |
質問
私の問題:
12-18 17:05:03.336:DEBUG/STRICTMODE(2112):StrictModeポリシー違反。 〜期間= 2073 ms:android.os.strictmode $ strictmodediskreadviolation:ポリシー= 23違反= 2
工場の方法から
12-18 17:05:03.336:debug/strictmode(2112):at android.graphics.bitmapfactory.decodefile(bitmapfactory.java:299)
その後、私のコードで
12-18 17:05:03.336:debug/strictmode(2112):atblah.imagecache.getFromCache(ImageCache.java:248)
12-18 17:05:03.336:debug/strictmode(2112):
atblah2 $ loaderthread $ 1.handlemessage(blah.java:63)
重要なスニップイット
class loaderthreadはhandlerthreadを拡張します{
パブリックハンドラーMhandler;
public loaderthread(string name){super(name); }
@Override public void onlooperprepared(){mhandler = new handler(){public void handlemessage(message msg){bitmap bit = migmecache.getInstance()。 }}; }}
ImageCacheクラス呼び出しのGetFromCacheメソッド
bitmap = BitmapFactory.decodeFile(fLoc);
これはUIスレッドで実行されているようですが、それは私には意味がありません。これは背景スレッドで呼び出されるべきではありませんか?これが使用の目標でした handlerthread 結局...
LoadThreadクラスは、このように私のonCreate(バンドル)で作成されます
LoaderThread Loader = new LoaderThread( "imgloader")
loader.start();
メッセージはハンドラーを介してUIスレッドから渡されます
loader.mhandler.dispatchmessage(loader.mhandler.obtainmessage(args ..));
これが静的なGetInstanceメソッドに関係しているのではないかと思います
public static同期ImageCache getInstance(){
if(_instance == null){_instance = new ImageCache(); } return _instance; }
解決
私は今お尻のように感じていますが、私は自分のハンドラーの間違った方法を呼んでいました...
間違ったやり方
loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..));
正しい方法
loader.mHandler.sendMessage(loader.mHandler.obtainMessage(args..));
したがって、どういうわけか、メッセージは背景のものではなくUIスレッドのすぐ上で、まだハンドラーを介して実行されていました。