移动应用开发实践-Task10-运用AsyncTask初始化城市数据

移动应用开发实践-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");
                }


            }
        });

4.结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值