java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。

时间:2017-01-12 10:40:55

标签: android

我想在工作线程上放置大量的add delete计算工作,在ui线程上工作notifyDataSetChanged。在此基础上避免了java.lang.IllegalStateException。例外情况如下:     java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保不从后台线程修改适配器的内容,而只是从UI线程修改。确保适配器在其内容更改时调用notifyDataSetChanged()。

代码简写如:

new Thread(){
            @Override
            public void run() {
                for(int i=0; i<5000; i++){
                    mDatas.add(i);
                }
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        }.start();

我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。

3 个答案:

答案 0 :(得分:0)

您正在非UI线程中向ArrayList添加项目并在UI线程上调用notifyDataSetChanged

new Thread(){
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        for(int i=0; i<5000; i++){
                            mDatas.add(i);
                        }
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        }.start();

答案 1 :(得分:0)

试试这个

在调用runOnUi线程

之前,检查mActivity是否为null
 new Thread(){
                @Override
                public void run() {
                    for(int i=0; i<5000; i++){
                        mDatas.add(i);
                    }
                  if(mActivity!=null){
                    mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                   }
                }
        }.start();

答案 2 :(得分:0)

有两种解决方案可以克服它。

1)使用AsyncTask并使用onPostExecute()方法更新适配器。

@override
protected void onPostExecute(String result) {
  mAdapter.notifyDataSetChanged();
}   

2)使用HandlerThread注册邮件,并在handleMessage()更新您的适配器。

    new Thread(){
        @Override
        public void run() {

                  handler.sendEmptyMessage(0);
                }
            });
        }
    }.start();

 Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            mAdapter.notifyDataSetChanged();
            return false;
        }
    });