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

Android java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知,android,performance,listview,Android,Performance,Listview,*java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保适配器的内容不是从后台线程修改的,而是仅从UI线程修改的 1.我的应用程序是使用GPS定位的导航应用程序,marker将根据用户的汽车驾驶从源到目的地设置动画,因此在同一活动中使用RightsideDrawer listview填充公路详细信息,获取当前位置后:它会自动更新右侧listview中附近的店铺位置及其详细信息,并使用listview中所有列表项的当前位置更新距离计算

*java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保适配器的内容不是从后台线程修改的,而是仅从UI线程修改的

1.我的应用程序是使用GPS定位的导航应用程序,marker将根据用户的汽车驾驶从源到目的地设置动画,因此在同一活动中使用RightsideDrawer listview填充公路详细信息,获取当前位置后:它会自动更新右侧listview中附近的店铺位置及其详细信息,并使用listview中所有列表项的当前位置更新距离计算(在RightNavigationSubViewAdapter-customadapter类中)

2.位置更新每3000ms调用一次CurrentLocationUpdateList,持续3秒。在更新右侧抽屉子列表视图(当用户驾驶时)时,Micromax TAB、三星Grand Prime和HTC 4.4.2等手机会发生崩溃。开车时,只有这些手机发生碰撞的情况非常罕见,我需要尽快修复。请帮我解决这个问题

@Override
public void onLocationChanged(Location location) {
try {
mCurrentLocation = location;
Singleton.getInstance().mCurrentLocation = location;
final LatLng position = new LatLng(location.getLatitude(), location.getLongitude());
if (isMapReady) {
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        try {
            CurrentLocationUpdateList();
        } catch (Exception e) {
            Log.d(TAG_MSG, "Error", e);
            e.printStackTrace();
        }
        checkAlertView();
        updateMarker(mCurrentLocation);
        updateCamera(position);
        updatePolyLine(position);
    }
});
}
} catch (Exception e) {
Log.d(TAG_MSG, "Error", e);
e.printStackTrace();
}
}
3.子列表视图的右侧抽屉布局,当右侧抽屉打开时,下面的功能将执行其UpdateRightSideOpenView工作。i、 e Singleton.getInstance().drawerropenRightSubList=true

public void CurrentLocationUpdateList {
if (Singleton.getInstance().drawerOpenRightSubList) { 
try {
new UpdateRightSideOpenView().execute();                         
}
catch (IllegalStateException e) {
e.printStackTrace();
}
} 
else {
try {
    new UpdateRightSideSubView().execute();
}
catch (IllegalStateException e) {
    e.printStackTrace();
}
}
}
4.右侧子视图func调用,RightNavigationSubViewAdapter用于打开的右侧抽屉,RightNavigationViewAdapter用于关闭的右侧抽屉,2个适配器用于2个listview,一个用于抽屉打开视图,另一个用于抽屉关闭视图,因此openview将获得额外数据

public class UpdateRightSideOpenView extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
return null;
}
protected void onPostExecute(Void result) {
try {
subAdapter = new RightNavigationSubViewAdapter(mContext, wayPoints);
mListSub.setAdapter(subAdapter);
mListSub.requestLayout();
subAdapter.notifyDataSetChanged();

adapter = new RightNavigationViewAdapter(mContext, wayPoints);// load new data
adapter.notifyDataSetChanged();
mList.requestLayout();
}
catch (IllegalStateException e) {
    e.printStackTrace();
}
}
}


public class UpdateRightSideSubView extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
return null;
}
protected void onPostExecute(Void result) {
try {
/*mListSub.invalidateViews(); *///invalidate old
subAdapter = new RightNavigationSubViewAdapter(mContext, wayPoints);
mListSub.setAdapter(subAdapter);
subAdapter.notifyDataSetChanged();          // call notifydatasetChanged
}
catch (IllegalStateException e) {
e.printStackTrace();
}
}
}
公共类UpdateRightSideOpenView扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
返回null;
}
受保护的void onPostExecute(void结果){
试一试{
子适配器=新的RightNavigationSubViewAdapter(mContext、航路点);
mListSub.setAdapter(子适配器);
mListSub.requestLayout();
subAdapter.notifyDataSetChanged();
adapter=new RightNavigationViewAdapter(mContext,航路点);//加载新数据
adapter.notifyDataSetChanged();
mList.requestLayout();
}
捕获(非法状态){
e、 printStackTrace();
}
}
}
公共类UpdateRightSideSubView扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的Void doInBackground(Void…参数){
返回null;
}
受保护的void onPostExecute(void结果){
试一试{
/*mListSub.invalidateViews();*///使旧的无效
子适配器=新的RightNavigationSubViewAdapter(mContext、航路点);
mListSub.setAdapter(子适配器);
subAdapter.notifyDataSetChanged();//调用notifyDataSetChanged
}
捕获(非法状态){
e、 printStackTrace();
}
}
}

如果总是
返回null,我不明白为什么要使用AsyncTasks
doInBackground()
中。为什么要使用它们?setAdapter及其notifyDatasetChanged已经在UI线程中完成了它的工作,所以我像这样包括了它,以前我也使用了runonUithread()方法,没有使用它。例如,子适配器=新的RightNavigationSubViewAdapter(mContext,航路点);mListSub.setAdapter(子适配器);mListSub.requestLayout();subAdapter.notifyDataSetChanged();但为什么要使用AsyncTask呢?你根本不需要在后台做任何事情。好吧,只需要在runonUIthread中调用该函数,没错,你知道吗