我想在工作线程上放置大量的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();
我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。
答案 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
线程
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)使用Handler
和Thread
注册邮件,并在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;
}
});