CoolWeather(《第一行代码》实战)遍历全国各省市县总结

时间:2021-06-10 03:27:47

说先还是要再重新过一遍流程:

1、新建一个建库类CoolWeatherOpenHelper。在这个类的OnCreate中放入db.execsql建表语句。这样在建库类被调用建立数据库的同时自动在库里初始化要建的表。

2、新建要操作的Model(City,Province,County).。定义里面的getting&setting方法。这个类我理解为每次从解析得到的信息读取一行。然后再把这一行存储到表中。

3、自定义一个数据库工具箱CoolWeatherDB。这个类相对比较复杂,我要一一细说。这个类相当于电脑的USB插口。APP进行操作的时候通过这个插口SAVE所得到的数据或者从里面读取save好的数据。这个类的代码写法是这样的:

1、声明数据库名,数据库版本。(这个不关键,却又必不可少,想略过不说又不行)

2、写本类的构造方法(并且私有化(这个对于程序能否运行不重要,但是private远远比public用的多,能不public就private吧))

这个构造方法调用了之前的建库类,用这个建库类生成一个数据库对象,以便以后对这个数据库对象进行操作。

3、写一个getInstance(获取实例)方法。以供调用。(有没有其他调用方法?)

4、这里就是本类的主要目的,封装需要的操作。这里具体来说就是各个表的Save方法和Load方法(这两个方法都是通过传入对应的Model类实现)。

                                                 这里简单说一下具体的SAVE LOAD 写法:

a、Save方法是当传入的province对象不为空,就将里面的值传入ContentValues类生成的对象values中。最后通过传入values用数据库自带    的insert方法将province对象的值写入表中。(province的值是从网络得到的信息解析来的,具体是网络——Model——数据库);

b、load方法  public  List<Province>  loadProvinces()这里设置本方法的返回类型为List<Province>,因为你总不能一个一个数据返回吧。

     具体来说就是 首先新建一个List<Province> list=new ArrayList<Province>();(这个用于存放之后Cursor读取出来的信息)

之后新建一个Cursor对象用它调用数据库的query方法(传入要读取的数据库内的表名,以及表内筛选条件==)

之后就是dowhile方法别忘了最后关闭cursor。  

   以上是数据库部分的操作具体是:建库类——目标的Getting&Setting——自定义工具箱。

然而还没完,继续。

5、新建一个HttpUti类,这个类用于向服务器发送请求,然后获取输入流。这个类也是以前没怎么见过所以梳理一下:

a、定义一个发送请求的方法sendHttpRequest(final String address,final HttpCallbackListener listener)传入的数据分别是网址和一个回调接口。

b、之后在这个方法里面开启一个线程并且在线程里面定义一个HttpURLConnection的对象connection。用于各种网络操作

c、读取connection调用方法获得的输入流

d、逐行读取所得的输入流,并且用append传入response。

e、如果listener不为空,先猜测服务器没有返回信息listener就为空。

                      f、之后别忘记断开connection和开启线程。

6、新建一个接口HttpCallbacklistener里面定义onFinish和onError方法。

7、新建一个Utility工具类,这个类用于解析服务器返回的数据。具体方法:

a、声明一个方法handlleProvincesResponse  声明为synchronized(一次只能被一个线程调用),static(静态的),返回类型是boolean

方法内传入 数据库工具箱的对象和response返回的数据。

b、之后在TextUtils调用的isEmpty()方法中传入返回的数据。确认response是否为空。

c、具体的解析操作 定义一个一位数组来存放第一次解析获得的数据response.split(",")

d、这个再次确认获得数据是否为空(不理解)然后 用for方法逐个读取,在方法里面新建一位数组存放二次解析获得的数据p.split("\\|");

然后分别传入Model中之后调用工具类保存。成功返回TRUE失败返回false。

以上是网络方面的操作,总结为  请求类——接口类——解析类


8、界面布置,标题栏(要用自己的标题栏要记得在主活动读取布局前隐藏系统标题栏)+表单(这里说一下遇到的问题。主方法Import了R类的会将会导致无法读取本项目中的布局)。

9、接下来是主活动的建立:

a、在onCreate方法中要初始化的东西:布局方面的就不说了

1、adapter,ArrayAdapter<String>传入this,list布局,和datalist(一个事先申明的表单用于存放在数据库工具类读取的信息)

生成的对象。这个adapter主要用于listView的传入数据,和设置布局。

                     2、listView传入adapter

               3、获取一个CoolWeatherDB工具类的实例。

4、设置setonClick方法,即城市省份被点击之后干什么(传入AdapterView<?>arg0,View view,int index,long arg3)

5、活动建立时读取省份数据queryProvinces();

b、省份,市,县数据本地读取。本地无尝试网络读取。

c、省份,市,县的网络读取。

d、进度对话框的调用

e、back键点击设置。

10、在配置文件AndroidManifest.xml中申请网络服务允许,设置主活动。

这就是整个流程。

接下来理清主活动运行思路:

1、主活动初始化,读取本地省份无,

                                       调用网络读取(自定义地址,显示加载动画,调用网络请求类(传入自定义地址,网络服务回调接口),

                                        调用网络解析类(传入工具类(save&load),服务器返回信息,model类))

   重新读取本地省份库(listView更新)。

2、点击选中城市,读取本地城市无,

   调用网络读取(自定义地址,显示加载动画,调用网络请求类(传入自定义地址,网络服务回调接口),

                                        调用网络解析类(传入工具类(save&load),服务器返回信息,model类)),

重新读取本地城市库。

3、点击选中县城,读取本地县城无,

  调用网络读取(自定义地址,显示加载动画,调用网络请求类(传入自定义地址,网络服务回调接口),

                                        调用网络解析类(传入工具类(save&load),服务器返回信息,model类)),

重新读取本地县城库。


具体运行顺序大概就是如此,实在找不到错误就根据LOGCAT等看看自己运行到哪个步骤判断可能错在哪几个位置。