又出现一次07-25 16:03:24.148: E/AndroidRuntime(7102): FATAL EXCEPTION: main
07-25 16:03:24.148: E/AndroidRuntime(7102): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131165218, class android.widget.ListView) with Adapter(class cn.qi.link.LinkTestActivity$PintTempDataAdapter)]
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.ListView.layoutChildren(ListView.java:1551)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.AbsListView.onLayout(AbsListView.java:2426)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1694)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1552)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1694)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1552)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1694)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1552)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.View.layout(View.java:14905)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewGroup.layout(ViewGroup.java:4601)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2213)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2027)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1237)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5162)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.Choreographer.doCallbacks(Choreographer.java:591)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.Choreographer.doFrame(Choreographer.java:561)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.os.Handler.handleCallback(Handler.java:725)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.os.Looper.loop(Looper.java:176)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at android.app.ActivityThread.main(ActivityThread.java:5319)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at java.lang.reflect.Method.invokeNative(Native Method)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at java.lang.reflect.Method.invoke(Method.java:511)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
07-25 16:03:24.148: E/AndroidRuntime(7102):  at dalvik.system.NativeStart.main(Native Method)

解决方案 »

  1.   

    参考建议 : 
    1.将所有数据“完全”保存在adapter内部,即使有外部数据进入,也会用.clone()重新生成副本,保证了数据完全是由adapter维护的。2.保证所有setDeviceList()/clearDeviceList()是从主线程里调用的,如何保证是从主线程中调用的呢:  a.调用Activity.runOnUIThread()方法;  b.使用Handler(其实这并不非常准确,因为Handler也可以运行在非UI线程);  c.使用AsyncTask。参考博客: http://blog.csdn.net/ueryueryuery/article/details/20607845
      

  2.   

    获取数据之后要adapter.notifyDataSetChanged()
      

  3.   

    正解我在 Handler 中更新的 不是 UI 线程吗
      

  4.   


    我在 Handler 中更新的 不是 UI 线程吗 
      

  5.   


    我在 Handler 中更新的 不是 UI 线程吗 你在Handler里执行什么更新UI的操作
      

  6.   


    我在 Handler 中更新的 不是 UI 线程吗 你在Handler里执行什么更新UI的操作 public void inflatePingListView(List<String[]> pingResults){
    adapter.setData(pingResults);
    adapter.notifyDataSetChanged();
    lv_ping_result.setVisibility(View.GONE);  
    lv_ping_result.requestLayout();
    lv_ping_result.setAdapter(adapter);
    lv_ping_result.setSelection(pingResults.size() - 1);
    lv_ping_result.setVisibility(View.VISIBLE); 
    }操作
      

  7.   

    你handle发消息给UI线程,让UI线程执行更新操作。
      

  8.   


    我在 Handler 中更新的 不是 UI 线程吗 你在Handler里执行什么更新UI的操作 public void inflatePingListView(List<String[]> pingResults){
    adapter.setData(pingResults);
    adapter.notifyDataSetChanged();
    lv_ping_result.setVisibility(View.GONE);  
    lv_ping_result.requestLayout();
    lv_ping_result.setAdapter(adapter);
    lv_ping_result.setSelection(pingResults.size() - 1);
    lv_ping_result.setVisibility(View.VISIBLE); 
    }操作lv_ping_result.setAdapter(adapter);
    这句之后你再执行
    adapter.notifyDataSetChanged();
      

  9.   


    我在 Handler 中更新的 不是 UI 线程吗 
    要看你的handler构造在哪个线程。