2010-12-18 58 views
3

我的問題:StrictMode混淆 - 這是錯誤的線程?

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; }

+0

@ smith234:你爲什麼使用'HandlerThread'而不是僅僅是一個'AsyncTask'? – CommonsWare 2010-12-18 22:40:20

+0

@CommonsWare我想看看它如何在ListView中加載圖像。有了'AsyncTask',我必須爲每個drawable產生一個新的。通過'HandlerThread',我可以將消息發送到它的looper(從磁盤加載文件並將消息發回給UI的looper,它可以更新所討論的行) – smith324 2010-12-19 00:47:47

回答

3

我覺得自己像個屁股了,但我呼籲我的處理程序錯誤的方法...

走錯了路

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

正道

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

所以不知何故,消息仍然通過處理程序運行,只是在UI線程而不是後臺運行。

+2

這意味着'StrictMode'能夠完成它的預期通過發出您的程序中潛在的問題來解決您的問題。 :) – 2010-12-19 10:49:07

+0

@Jean Hominal多數民衆贊成在正確的!我一直在享受使用'StrictMode'來找到這些問題,但這只是給我一個曲線球。 – smith324 2010-12-19 17:30:54