总结一下目前我应用到的访问网络json数据的方式有四种:
1.Httpclient方式
2.HttpUrlConnection 方式
3.AsyncTask方式
4.HttpUtils方式
HttpClient 和HttpUrlConnection两种方式这里暂不讨论,针对AsyncTask方式访问网络json数据来进行简单的理解描述。
1.AsyncTask异步加载类原理描述:
AsyncTask的本质是一个线程池,最大能加载128个线程池子。所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler。AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用。Android之所以提供AsyncTask这个类,就是为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作。在使用AsyncTask时,我们无需关注Thread和Handler,AsyncTask内部会对其进行管理,这样我们就只需要关注于我们的业务逻辑即可。
AsyncTask有四个重要的回调方法,分别是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。这四个方法会在AsyncTask的不同时期进行自动调用,我们只需要实现这几个方法的内部逻辑即可。这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result,代码片段如下:
// 自定义类继承异步加载类AsyncTask
//可变参数列表:
//第一个参数表示做耗时操作doInBackground方法返回的返回值类型,返回的值也是联网后方法里传的参数;
//第二个参数表示进度更新时onProgressUpdate方法的进度类型
//第三个参数表示做耗时操作doInBackground方法的返回值类型也是联网后onPostExecute方法里的传参
package com.hhh.text_asynctask_lianxi;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import com.google.gson.Gson;
import com.hhh.text_base.MyBaseAdapter;
import com.hhh.text_dao.Li;
import com.hhh.text_dao.Wai;
import android.os.AsyncTask;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
/**
* 使用异步加载类AsyncTask来实现对网络数据的请求解析并绑定
* @author xingzhe
*注意各个类中的各个方法是什么意思以及各个方法传参的逻辑关系*
* 注意 :AsyncTask必须在ui线程中执行,AsyncTask类中的方法无需手动调用
* 标准
*/
public class MainActivity extends Activity {
private ListView listview;
private String url = "http://apis.juhe.cn/goodbook/catalog?key=cca134699ab46a8322a322c8c011449a";
public String entitydata;
private List<Li> result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
// 实例化异步加载类对象
MyAsyncTask myasynctask = new MyAsyncTask();
try {
// 意指从异步加载类中执行联网操作的doInBackground方法中返回的返回值获取到
List<Li> result = myasynctask.execute(url).get();
MyBaseAdapter base = new MyBaseAdapter(MainActivity.this, result);
listview.setAdapter(base);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 自定义类继承异步加载类AsyncTask
//可变参数列表:
//第一个参数表示做耗时操作doInBackground方法返回的返回值类型,返回的值也是联网后方法里传的参数;
//第二个参数表示进度更新时onProgressUpdate方法的进度类型
//第三个参数表示做耗时操作doInBackground方法的返回值类型也是联网后onPostExecute方法里的传参
class MyAsyncTask extends AsyncTask<String, Integer, List<Li>> {
private Wai wai;
@Override
// 联网请求数据前的方法
protected void onPreExecute() {
Toast.makeText(MainActivity.this, "即将联网中。。。", 0).show();
}
@SuppressLint("ShowToast")
@Override
// 联网请求数据--->做耗时操作的方法
protected List<Li> doInBackground(String... params) {
// 结合httpclient方式进行访问网络数据
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response;
try {
response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity httpentity = response.getEntity();
//这里要注意:获得的实体数据才是联网
entitydata = EntityUtils.toString(httpentity);
Log.i("SSS", "--------------------------" + entitydata);
Gson gson = new Gson();
wai = gson.fromJson(entitydata, Wai.class);
result = wai.getResult();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
// 联网请求数据后的方法
@Override
protected void onPostExecute(List<Li> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
// 进度条进度更新的方法
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
}