SilenceDut/TaskScheduler

请教

Closed this issue · 9 comments

qzqs commented

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才能更新 那这样和一般的异步有什么区别哦

qzqs commented

我解决这个问题了,我把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);
            }
        });
ylmyg commented

谢谢, 是我理解错了,我使用了没有返回值的线程,有返回值的应该是在onSuccess()进行UI更新

ylmyg commented

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) { 会报错类转换错误,不知道什么意思

应该是你那类型转换的问题,你再仔细看看吧

ylmyg commented

解决了,感谢~

ylmyg commented

有个问题还想问下
你获取全部城市的时候
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,难道和数据库性能有关。

这个就不了解了

qzqs commented

这个我发现是什么问题了,而且我觉得你逻辑有点问题,获取城市信息的时候你每次都去获取所有的城市信息,放进数据库,然后判断集合里面是否有,有就直接调用,不走从数据库获取,那这样从数据库去获取城市信息有什么用呢?