【发布时间】:2010-12-19 18:23:55
【问题描述】:
我的问题:
12-18 17:05:03.336:DEBUG/StrictMode(2112):StrictMode 策略违规; ~duration=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: 调试/严格模式(2112):在 blah.ImageCache.getFromCache(ImageCache.java:248)
12-18 17:05:03.336: 调试/严格模式 (2112):
在 blah2$LoaderThread$1.handleMessage(blah.java:63)
重要的片段
类 LoaderThread 扩展 HandlerThread {
公共处理程序 mHandler;
公共LoaderThread(字符串名称){ 超级(名称); }
@覆盖 公共无效 onLooperPrepared(){ mHandler = 新的处理程序(){ 公共无效句柄消息(消息消息){ 位图位 =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 方法有关
公共静态同步 ImageCache getInstance() {
如果(_instance==null){ _instance = new ImageCache(); } 返回_实例; }
【问题讨论】:
-
@smith234:你为什么使用
HandlerThread而不仅仅是AsyncTask? -
@CommonsWare 我想看看它如何在
ListView中加载图像。使用AsyncTask,我必须为每个可绘制对象生成一个新对象。使用HandlerThread,我可以将消息发布到它的循环器(它从磁盘加载文件并将消息发送回用户界面的循环器,它可以更新有问题的行)
标签: android file-io handler looper android-strictmode