3

私の問題:

12-18 17:05:03.336:DEBUG / StrictMode(2112):StrictModeポリシー違反。〜duration = 2073 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy=23違反=2

ファクトリメソッドから

12-18 17:05:03.336:DEBUG / StrictMode(2112):android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)

それから私のコードで

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)

重要な切り取り-その

クラスLoaderThreadはHandlerThreadを拡張します{

パブリックハンドラーmHandler;

public LoaderThread(String name){super(name); }

@Override public void onLooperPrepared(){mHandler = new Handler(){public void handleMessage(Message msg){Bitmap bit = ImageCache.getInstance()。getFromCache((String)msg.obj、ImageCache.USE_DISK); }}; }}

ImageCacheクラスのgetFromCacheメソッドは

bitmap = BitmapFactory.decodeFile(fLoc);

これはUIスレッドで実行されているようですが、私には意味がありません。これはバックグラウンドスレッドで呼び出されるべきではありませんか?結局、これがHandlerThreadを使用する目的でした...

LoadThreadクラスはこのように私のonCreate(bundle)で作成されます

LoaderThread loader = new LoaderThread( "imgLoader")

loader.start();

メッセージはUIスレッドからハンドラーを介して渡されます

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

これは静的なgetInstanceメソッドと関係があるのだろうかと思います

パブリック静的同期ImageCachegetInstance(){

if(_instance == null){_instance = new ImageCache(); } return _instance; }

4

1 に答える 1

3

今はお尻のように感じますが、ハンドラーで間違ったメソッドを呼び出していました...

間違った方法

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

正しい方法

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

どういうわけか、メッセージはハンドラーを介して実行されていましたが、バックグラウンド スレッドではなく UI スレッドで実行されていました。

于 2010-12-19T10:23:55.273 に答える