【问题标题】:StrictMode confusion - how is this the wrong thread?StrictMode 混乱 - 这是怎么回事?
【发布时间】: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


【解决方案1】:

我现在感觉自己像个混蛋,但我在处理程序上调用了错误的方法...

走错路

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

正确的方法

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

所以不知何故,消息仍在通过处理程序运行,只是在 UI 线程上而不是在后台线程上。

【讨论】:

  • 这意味着StrictMode 能够通过指示您能够修复的程序中的潜在问题来实现其预期目标。 :)
  • @Jean Hominal 没错!我一直很喜欢使用StrictMode 来查找这些问题,不过这个问题只是给我扔了一个曲线球。
猜你喜欢
  • 2021-08-29
  • 2011-07-06
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2022-01-23
  • 2020-04-03
  • 2018-06-20
相关资源
最近更新 更多