请教
Closed this issue · 9 comments
TaskScheduler.execute(() -> {
List allCity = DBUtils.getCityManager().queryLike(keyword);
if (ObjectUtils.isNotEmpty(allCity)) {
List cityInfoDatas = new ArrayList<>();
for (City city : allCity) {
cityInfoDatas.add(new CityInfoData(city.country, city.countryEn, city.cityId));
}
mView.showMatchCitys(cityInfoDatas);
}
});
我在线程里面去获取数据库的信息。
mView.showMatchCitys(cityInfoDatas)//UI更新
就报错
Only the original thread that created a view hierarchy can touch its views
不能在线程更新UI了,是不是还得用handler才能更新 那这样和一般的异步有什么区别哦
我解决这个问题了,我把UI更新放倒线程之外就可以了。我现在在学习你的天气APP,写得不错。
差别还是很大的,可以看下使用说明
TaskScheduler.execute(new Task<List>() {
@Override
public List doInBackground() throws InterruptedException {
/**后台线程*/
List allCity = DBUtils.getCityManager().queryLike(keyword);
List cityInfoDatas = new ArrayList<>();
if (ObjectUtils.isNotEmpty(allCity)) {
for (City city : allCity) {
cityInfoDatas.add(new CityInfoData(city.country, city.countryEn, city.cityId));
}
}
return cityInfoDatas;
}
@Override
public void onSuccess(List result) {
/**UI线程*/
mView.showMatchCitys(cityInfoDatas);
}
});
谢谢, 是我理解错了,我使用了没有返回值的线程,有返回值的应该是在onSuccess()进行UI更新
TaskScheduler.execute(new Task() {
@OverRide
public List doInBackground() throws InterruptedException {
/*后台线程/
List allCity = DBUtils.getCityManager().queryLike(keyword);
List cityInfoDatas = new ArrayList<>();
if (ObjectUtils.isNotEmpty(allCity)) {
for (City city : allCity) {
cityInfoDatas.add(new CityInfoData(city.country, city.countryEn, city.cityId));
}
}
return cityInfoDatas;
}
@OverRide
public void onSuccess(List result) {
/*UI线程/
mView.showMatchCitys(result);
}
});
但是按照这样的写法 for (City city : allCity) { 会报错类转换错误,不知道什么意思
应该是你那类型转换的问题,你再仔细看看吧
解决了,感谢~
有个问题还想问下
你获取全部城市的时候
CoreManager.getImpl(ICityRepositoryApi.class).getCityWorkHandler().post(new Runnable() {
@OverRide
public void run() {
List allCity = CoreManager.getImpl(ICityRepositoryApi.class).queryAllCities();
if(allCity !=null) {
List<CityInfoData> cityInfoDatas = new ArrayList<>();
String lastInitial = "";
for(City city : allCity) {
CityInfoData cityInfoData = new CityInfoData(city.country,city.countryEn,city.cityId);
String currentInitial = city.countryEn.substring(0, 1);
if (!lastInitial.equals(currentInitial) ) {
cityInfoData.setInitial(currentInitial);
lastInitial = currentInitial;
}
cityInfoDatas.add(cityInfoData);
}
mAllCityData.postValue(cityInfoDatas);
}
}
});
================================================
我获取全部城市的时候是
TaskScheduler.execute(new Task<List>() {
@OverRide
public List doInBackground() throws InterruptedException {
/*后台线程/
mAllCityData = DBUtils.getCityManager().query();
if(ObjectUtils.isNotEmpty(mAllCityData)) {
cityInfoDatas = new ArrayList<>();
String lastInitial = "";
for(City city : mAllCityData) {
CityInfoData cityInfoData = new CityInfoData(city.country,city.countryEn,city.cityId);
String currentInitial = city.countryEn.substring(0, 1);
if (!lastInitial.equals(currentInitial) ) {
cityInfoData.setInitial(currentInitial);
lastInitial = currentInitial;
}
cityInfoDatas.add(cityInfoData);
}
}
return cityInfoDatas;
}
@OverRide
public void onSuccess(List result) {
/*UI线程/
mView.showAllCitys(result);
}
});
我新开一个线程去获取,但是为什么我获取很慢,而你获取很呢,我用的数据库框架是greenDao,难道和数据库性能有关。
这个就不了解了
这个我发现是什么问题了,而且我觉得你逻辑有点问题,获取城市信息的时候你每次都去获取所有的城市信息,放进数据库,然后判断集合里面是否有,有就直接调用,不走从数据库获取,那这样从数据库去获取城市信息有什么用呢?