移动应用开发实践-Task10-关于安卓的异步查询操作
目的
在最开始载入guolin中所有中国的城市数据,保存到数据库。
1.配置GenerateDatabaseTask
GenerateDatabaseTask是继承AsyncTask的,我们主要重写onPostExecute、onProgressUpdate、doInBackground三个方法。
package com.example.fyn_weather_task9_0.db;
import ...
public class GenerateDatabaseTask extends AsyncTask<Void, Integer, Integer> {
private Activity activity;
private ProgressDialog progressDialog;
private String baseUrl = "http://guolin.tech/api/china";
private CityDatabase cityDatabase;
public GenerateDatabaseTask(Activity activity, CityDatabase cityDatabase) {
this.activity = activity;
this.cityDatabase = cityDatabase;
}
private void iniProgressDialog(int max) {
progressDialog = new ProgressDialog(activity);
progressDialog.setTitle("Generating database...");
progressDialog.setMessage("Inserted data: ");
progressDialog.setMax(max);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setProgress(0);
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
progressDialog.dismiss();
Toast.makeText(activity, String.format("Inserted data: %d", integer), Toast.LENGTH_LONG);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
progressDialog.setMessage(String.format("Inserted data: %d", values[1]));
}
@Override
protected Integer doInBackground(Void... voids) {
int count = 0;
String s = HttpUtil.getOkHttpBlock(baseUrl);
final List<City> provinceList = JsonUtil.getCityListFromJson(s, -1, 0);
if (provinceList != null && provinceList.size() > 0) {
//初始化进度条
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
iniProgressDialog(provinceList.size());
}
});
cityDatabase.clearDatabase();
count += cityDatabase.insertList(provinceList);
for (int i = 0; i < provinceList.size(); i++) {
City province = provinceList.get(i);
String provinceUrl = String.format("%s/%d", baseUrl, province.getId());
String s1 = HttpUtil.getOkHttpBlock(provinceUrl);
List<City> CityList = JsonUtil.getCityListFromJson(s1, province.getId(), 1);
count += cityDatabase.insertList(CityList);
for (int j = 0; j < CityList.size(); j++) {
City city = CityList.get(j);
String cityUrl = String.format("%s/%d", provinceUrl, city.getId());
String s2 = HttpUtil.getOkHttpBlock(cityUrl);
List<City> countryList = JsonUtil.getCityListFromJson(s2,city.getId(),2);
count+=cityDatabase.insertList(countryList);
publishProgress(i,count);
}
publishProgress(i+1,count);
}
}
return count;
}
}
doInBackground中cityDatabase.clearDatabase();是为了清空数据库,防止数据重复
2.MainActivity中的调用
增加按钮,按钮点击事件调用GenerateDatabaseTask。
Button bt_db = findViewById(R.id.bt_db);
bt_db.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new GenerateDatabaseTask(MainActivity.this, cityDatabase).execute();
}
});
3.修复关于level_0_id的bug
之前是通过点击省份之后赋值给level_0_id这个全局参数,然后back时候可以找到回去的路,但是如果搜索找到,点击进去之后就不知道省份id了,因为没有赋值过,这里重写用的方法是通过城市id找回去。
- CityDatabase.java
public City queryCityById(int id, int level) {
String s = String.format("select * from %s where %s=%d and %s=%d", CITY_TABLE, KEY_ID, id, KEY_LEVEL, level);
List<City> cityListBySql = getCityListBySql(s, null);
if (cityListBySql != null && cityListBySql.size() > 0) {
return cityListBySql.get(0);
}
return null;
}
- MainActivity.java
Button button = findViewById(R.id.bt_back);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (adapter.getCount() > 0) {
City city = adapter.getItem(0);
int level = city.getLevel();
String url;
switch (level) {
case 0:
showToast("已在初始目录");
break;
case 1:
url = baseUrl;
getAndUpdateCityList(url, -1, level - 1);
break;
case 2:
City city_l1 = cityDatabase.queryCityById(city.getParentId(), 1);
level_0_id = city_l1.getParentId();
int parentId = level_0_id;
url = String.format("%s/%d", baseUrl, parentId);
getAndUpdateCityList(url, parentId, level - 1);
break;
}
} else {
showToast("error");
}
}
});