http请求 网络请求 从网路读数据
读取网络数据
URL httpUrl = new URL(jsonUrl);//创建url http地址
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();//打开http 链接
InputStream in = conn.getInputStream();//得到输入流//这个一句从阻塞单线线程。
android里读取网路数据必须在子线程里
httpRead(url,callback){
Handler handler=new Handler();//倒主线程使用
new Thread(){
public void run(){
URL httpUrl = new URL(jsonUrl);//创建url http地址
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();//打开http 链接
InputStream in = conn.getInputStream();//得到输入流//这个一句从阻塞单线线程。
----------------------------------------------------------------------------------
网络返回成功时:
String str=从in从读数据;
//当前的子线程中执行callback的onSucces
callback.onSucces(str);
//用handler倒到主线程中执行onSucces
handler.post(new Runnable(){
callback.onSucces(str);
});
-----------------------------------------------------------------------------------------------------------
网络返回失败时:
//当前的子线程中执行callback的onError
callback.onError();
/用handler倒到主线程中执行onError
handler.post(new Runnable(){
callback.onSucces(str);/
});
}
}
}
第三方库已经封装上面的开辟线程和倒主线程的逻辑,只需传url与callback,注意callback已经别倒到住线程了。
例如:第三方网络库android-async-http:
asyncHttpClient=new AsyncHttpClient();//整个项目工程只需要一个。
asyncHttpClient.get(jsonUrl, new TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
//主线程执行,responseString是网络返回的结果
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
//主线程执行网络出错
}
}
例如:第三方网络库Volley:
RequestQueue requestQueue= Volley.newRequestQueue(context);
StringRequest request = new StringRequest(Request.Method.GET,
url,
new Response.Listener<String>() {
public void onResponse(String s) {
//主线程执行,s是网络返回的结果
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//主线程执行网络出错
}
});
requestQueue.add(request);
//request可以设置超时时间
request.setRetryPolicy(new DefaultRetryPolicy(
60000, //timeout时间
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,//重连次数
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
注意5.0以上需要在主模块build.gradle加
android {
useLibrary 'org.apache.http.legacy'//必须在第一行
}