12-18 17:05:03.336:DEBUG/StrictMode(2112):StrictMode違反政策; 〜持續時間= 2073毫秒:android.os.StrictMode $ StrictModeDiskReadViolation:政策= 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 {
public Handler mHandler;
public LoaderThread(String name){ super(name); }
@Override 公共無效onLooperPrepared(){ mHandler =新的處理程序(){ 公共無效的handleMessage(消息MSG){ 位圖位= ImageCache.getInstance()。getFromCache((字符串)msg.obj ,ImageCache.USE_DISK); } }; }}
的getFromCache方法在ImageCache類調用
bitmap = BitmapFactory.decodeFile(fLoc);
這似乎是在UI線程上運行,但它是沒有意義的我。難道這不會被後臺線程調用嗎?這是使用畢竟HandlerThread的目標...
的LoadThread類是在我的onCreate(捆綁)創造了這樣
LoaderThread裝載機=新LoaderThread( 「imgLoader」)
裝載機。開始();
和消息被從UI線程通過處理程序
loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(參數傳遞..));
我想知道如果這與getInstance方法是靜態的
公共靜態同步ImageCache的getInstance(){
如果(_instance == NULL){ _instance做= new ImageCache(); } return _instance; }
@ smith234:你爲什麼使用'HandlerThread'而不是僅僅是一個'AsyncTask'? – CommonsWare 2010-12-18 22:40:20
@CommonsWare我想看看它如何在ListView中加載圖像。有了'AsyncTask',我必須爲每個drawable產生一個新的。通過'HandlerThread',我可以將消息發送到它的looper(從磁盤加載文件並將消息發回給UI的looper,它可以更新所討論的行) – smith324 2010-12-19 00:47:47