86.Android Http 【异步任务】【该方法较好】
1.案例1是利用异步任务从网上下载图片[结果与上例相同]
注意AsyncTask泛型的三个参数:String是URL,Integer是内部的Progress,Bitmap是返回的结果,也是onPostExecute方法的参数。
2.案例2是利用异步任务从服务器获取Json字符串转成需要的表格
(1)Web服务器在本地
通过一个Servlet输出一个Json字符串
[{"id":1,"stuName":"marry","stuAge":22},{"id":2,"stuName":"girl","stuAge":22},{"id":3,"stuName":"tomd","stuAge":12},{"id":4,"stuName":"lucy","stuAge":12},{"id":9,"stuName":"kaka","stuAge":11},{"id":10,"stuName":"lili","stuAge":22},{"id":11,"stuName":"xiaoming","stuAge":23},{"id":12,"stuName":"huhu","stuAge":33},{"id":13,"stuName":"bobo","stuAge":21}]
(2)然后在Andorid项目中获取
方法:创建一个内部类继承于AsyncTask抽象类,并实现它的方法。
该抽象类中有4个方法:
protected String doInBackground(String... params);
该方法是后台运行的函数,即冲服务器下载数据的函数。通过它获取到一个包含所需信息的对象。【它运行在主线程之外】
protected void onPreExecute();
该方法是在doInBackground这个方法调用之前使用的方法,一般可以用来启动进度条之类的动作。【它运行在主线程之内】
protected void onPostExecute(Bitmap result);
该方法是在doInBackground这个方法调用之后使用的方法,一般可以用来更新界面。【它运行在主线程之内】
(3)数据加工
从第二步中的doInBackground方法中我们得到了对应的数据的实例,但是如果要将它显示在手机上,需要对他进行加工。利用Gson可以将Json字符串反序列化,转成一个对象:注意必须是标准的JSON字符串
因为需要将数据放入一个ListView中,所以要使用到一个适配器(Adapter),这里选用的是SimpleAdapter,而SimpleAdapter需要一个List<Map<String,Object>>集合,所以我将students这个集合对象转换成需要的list集合对象:
这样即可将students集合转成需要的对象。然后放入对应的TextView中即可:
总结注意:1.异步任务中的三个方法中onPreExecute和onPostExecute都是运行在主线程里,doInBackground是运行在主线程之外的,因为外部加载数据无法在主线程中进行。
2.之前犯下的错误:在activity_main.xml中定义了一个ListView控件,然后又定义了一个存放List单个元素的listview_item.xml,特别注意该xml只是个布局文件,使用LinearLayout,不是ListView