Android StrictMode混乱-这怎么是错误的线程?

Android StrictMode混乱-这怎么是错误的线程?,android,file-io,handler,looper,android-strictmode,Android,File Io,Handler,Looper,Android Strictmode,我的问题: 12-18 17:05:03.336:调试/严格模式(2112):严格模式策略冲突~持续时间=2073毫秒:android.os.StrictMode$StrictModeDiskReadViolation:policy=23 violation=2 从工厂法 12-18 17:05:03.336:DEBUG/StrictMode(2112):在android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)上 然后在

我的问题:

12-18 17:05:03.336:调试/严格模式(2112):严格模式策略冲突~持续时间=2073毫秒:android.os.StrictMode$StrictModeDiskReadViolation:policy=23 violation=2

从工厂法

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

然后在我的代码中

12-18 17:05:03.336: 调试/严格模式(2112):在 blah.ImageCache.getFromCache(ImageCache.java:248)

12-18 17:05:03.336: 调试/严格模式(2112):
在 blah2$LoaderThread$1.handleMessage(blah.java:63)

重要剪报

类LoaderThread扩展了HandlerThread{

公共管理者

公共加载线程(字符串名称){ 超级(姓名); }

@凌驾 public void onloperprepared(){ mHandler=新处理程序(){ 公共无效handleMessage(消息消息消息){ 位图位=ImageCache.getInstance().getFromCache((字符串)msg.obj,ImageCache.USE_DISK); } }; } }

ImageCache类中的getFromCache方法调用

bitmap = BitmapFactory.decodeFile(fLoc);
它似乎在UI线程上运行,但对我来说没有意义。这不应该在后台线程上调用吗?这毕竟是使用的目标

LoadThread类是在我的onCreate(bundle)中创建的,如下所示

LoaderThread loader=新的LoaderThread(“imgLoader”)

loader.start()

消息通过处理程序从UI线程传递

loader.mHandler.dispatchMessage(loader.mHandler.ActainMessage(args..)

我想知道这是否与静态的getInstance方法有关

公共静态同步ImageCache getInstance(){

如果(_instance==null){ _实例=新的ImageCache(); } 返回_实例; }


我现在觉得自己像个傻瓜,但我在我的处理器上调用了错误的方法

走错路

loader.mHandler.dispatchMessage(loader.mHandler.obtainMessage(args..));
正确的方法

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

因此,消息仍然在处理程序中运行,只是在UI线程上而不是在后台线程上。

@smith234:为什么您使用
HandlerThread
而不是
AsyncTask
?@Commonware我想看看它在
列表视图中加载图像时的性能。使用
AsyncTask
时,我必须为每个可绘制任务生成一个新任务。使用
HandlerThread
我可以将消息发送到它的looper(从磁盘加载文件并将消息发送回UI的looper,该looper可以更新相关行),这意味着
StrictMode
能够通过发信号通知您的程序中有一个您能够修复的潜在问题来实现其预期目标。:)@吉恩·霍米纳尔:没错!我一直很喜欢使用
StrictMode
来发现这些问题,但这一次给了我一个曲线球。