代码之家  ›  专栏  ›  技术社区  ›  anon

Android:IllegalStateException-何时抛出?

  •  7
  • anon  · 技术社区  · 14 年前

    在我的应用程序中,有时会引发以下异常:

    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):
    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(2131099717, class android.widget.ListView) with
    Adapter(class ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter)]
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.ListView.layoutChildren(ListView.java:1432)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.AbsListView.onLayout(AbsListView.java:1113)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.onLayout(LinearLayout.java:920)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.View.layout(View.java:6831)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.ViewRoot.performTraversals(ViewRoot.java:996)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.os.Handler.dispatchMessage(Handler.java:99)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.os.Looper.loop(Looper.java:123)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    android.app.ActivityThread.main(ActivityThread.java:4338)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    java.lang.reflect.Method.invokeNative(Native Method)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    java.lang.reflect.Method.invoke(Method.java:521)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    07-28 14:49:25.398: ERROR/AndroidRuntime(8097):     at
    dalvik.system.NativeStart.main(Native Method)
    

    很难找到错误,因为在stacktrace中没有列出我的方法。那么,有人知道什么时候抛出这个异常吗?谢谢你的提示。

    6 回复  |  直到 14 年前
        1
  •  4
  •   Michael B.    14 年前

    您可以在stacktrace中看到错误:

    适配器的内容已更改 通知。确保 您的适配器不是从 后台线程,但只能从

    在Android中实现这一点的方法是使用Handler。

    http://developer.android.com/guide/appendix/faq/commontasks.html#threading

        2
  •  23
  •   Hamy    14 年前

    它会告诉您发生错误的类: ch.uzh.csg.games4blue.gamebase.view.UserView UserAdapter 在里面。

    ListView 带着一个 Adapter 列表视图

    通常,创建ListView,创建适配器,在ListView上设置适配器,就完成了。其余的由Android操作系统负责。然而,你想做的事情要复杂一些。您正在尝试偶尔更新适配器中的数据。您可以想象,如果适配器数据发生更改,listview将需要得到通知,对吗?如果您正在显示一个包含2个项目的列表,并且突然又向适配器添加了2个项目,那么该列表现在应该显示4个项目!但是,如果listview必须不断地检查适配器是否发生了更改,这将是非常低效的,对吗?因此,需要发生的是listview将假定适配器没有更改,并且适配器将通知listview它是否更改(listview和适配器之间的这个协议允许其他好处,例如listview可以缓存从适配器检索到的一些项目,以便快速访问。也就是说,如果屏幕上显示了10个列表项,那么该列表实际上可能已经请求了14个项。这样,如果您向上或向下滚动,在任一方向上至少有2个项目的ListView已经有了要显示的数据!)

    之后 您已经将其提供给ListView。

    免责声明2:我累了,这似乎写得不好。把它变成一个维基,希望有人能帮我收拾深夜的烂摊子。如果这是完全无法理解的只是这么说,我会删除它

        3
  •  2
  •   JRL    14 年前

    您使用的位置 ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter .

        4
  •  1
  •   Sephy    14 年前


    试着打电话 .notifyDataSetChanged() 在适配器上。

        5
  •  1
  •   Dev.Sinto    13 年前

    我遇到了与您相同的问题,我使用asynchrousTask填充listview中的数据

    1. onPostExecute()

    因为这些函数在UI线程中运行。

    希望这有帮助。

        6
  •  0
  •   albnok    12 年前

    我刚修好了!

    以前我是这样做的,在哪里 list 是静态的,在Activity类下:

    @Override
    protected Void doInBackground(Void... arg0) {
        for (int i=0; i<bigChunk.size(); i++) {
            list.add(somethingHeavy(i));
        }
    }
    

    List<YourObject> listToAdd;
    @Override
    protected Void doInBackground(Void... arg0) {
        listToAdd = new ArrayList<YourObject>();
        for (int i=0; i<bigChunk.size(); i++) {
            listToAdd.add(somethingHeavy(i));
        }
    }
    @Override
    protected void onPostExecute(Void result) {
        list = listToAdd;
        adapter.notifyDataSetChanged();
    }