跟踪不在UI线程上的适配器数据的修改

时间:2013-05-24 13:58:16

标签: android multithreading ui-thread

我刚刚继承了大约100个活动的非常大的代码库。似乎过去的开发人员并不了解如何仅更新UI线程上的适配器数据并记得通知数据集已更改。在bugsense中,我有许多堆栈跟踪,例如指出它导致崩溃。

问题是堆栈跟踪是所有操作系统级别的,并没有实际指向导致问题的原因。是否有任何系统的方法可以找到任何人都知道的问题?我知道我可以通过手动检查整个代码库中的所有适配器使用来修复它们,但这并不是真正有效地利用时间,我想要解决这个问题。

  

java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保不从后台线程修改适配器的内容,而只是从UI线程修改。 [在ListView(16908298,类android.widget.ListView)中使用Adapter(类android.widget.HeaderViewListAdapter)]

2 个答案:

答案 0 :(得分:1)

您使用的是什么IDE?您可以将代码加载到与ADT捆绑在一起的IDE中。在那里,您可以找到特定类的参考(快捷方式取决于您的操作系统)。对所有适配器或任何其他相关代码执行此操作。这也适用于编译的类文件。

enter image description here

答案 1 :(得分:1)

这是一个想法:

  1. 使用以下命令获取对应用程序主线程的引用:

    Thread mainThread = Looper.getMainLooper().getThread();
    
  2. 在您对代码中的适配器进行每次方法调用之前,请检查您当前是否正在应用程序的主线程上执行(例如,通过测试相等性):

    if (!mainThread.equals(Thread.currentThread())) {
        // Then throw a runtime exception or log an error to indicate
        // that the code is not thread safe.
    }