package com.zjw.mynetwork8; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; //9.5 p344 网络编程的最佳实践 /* 封装网络请求v1.0 public class HttpUtil { public static String sendHttpRequest(String address) { HttpURLConnection httpURLConnection = null; try { URL url=new URL(address); httpURLConnection= (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setReadTimeout(5000); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); InputStream inputStream = httpURLConnection.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder=new StringBuilder(); String line; while((line=bufferedReader.readLine())!=null){ stringBuilder.append(line); } return stringBuilder.toString(); } catch (Exception e) { e.printStackTrace(); return e.getMessage(); }finally { if(httpURLConnection!=null){ httpURLConnection.disconnect(); } } } } 调用: String address="https://www.baidu.com"; String response=HttpUtil.sendHttpRequest(address); 问题:网络请求为耗时操作要在子线程执行, 如果在sendHttpRequest()方法内部直接开启线程不做其他处理,方法会在服务器还没来得及响应就执行结束了 解决:需要使用Java回调机制 */ /* Java回调机制使用流程: 1.定义一个接口: public interface HttpCallbackListener{ void onFinish(String response);//服务器响应成功时调用 void onError(Exception e);//网络操作出现错误时调用 } */ /* 封装网络请求v2.0 public class HttpUtil { public static void sendHttpRequest(final String address, final HttpCallbackListener httpCallbackListener) { new Thread(new Runnable() { @Override public void run() { HttpURLConnection httpURLConnection = null; try { URL url = new URL(address); httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setReadTimeout(5000); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); InputStream inputStream = httpURLConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } if(httpCallbackListener!=null){ httpCallbackListener.onFinish(stringBuilder.toString()); } } catch (Exception e) { if(httpCallbackListener!=null){ httpCallbackListener.onError(e); } } finally { if (httpURLConnection != null) { httpURLConnection.disconnect(); } } } }).start(); } } 注意:子线程中是无法通过return语句来返回数据的(run方法没有返回值) 调用: String address="https://www.baidu.com"; HttpUtil.sendHttpRequest(address,new HttpCallbackListener(){ @Override public void onFinish(String response) { } @Override public void onError(Exception e) { } }); */ /* 使用OkHttp: public static void sendOkHttpRequest(String address, okhttp3.Callback callback) { OkHttpClient okHttpClient=new OkHttpClient(); Request request=new Request.Builder() .url(address) .build(); okHttpClient.newCall(request).enqueue(callback); } OkHttp在enqueue()方法内部以及开了子线程,会在子线程中执行HTTP请求,并将结果回调到okhttp3.Callback中 调用方法: HttpUtil.sendOkHttpRequest(address, new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { //得到服务器返回的具体内容 String responseData=response.body().toString(); } @Override public void onFailure(Call call, IOException e) { //在这里对异常情况进行处理 } }); */ /* 注意:两者接口回调都是在子线程运行,所以不可以在这里执行UI操作,除非借助runOnUiThread()方法 */ public class PracticeOfNetwork extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_of_network); String address = "https://www.baidu.com"; HttpUtil.sendHttpRequest(address, new HttpCallbackListener() { @Override public void onFinish(String response) { //这里根据返回内容执行具体的逻辑 } @Override public void onError(Exception e) { //在这里对异常情况进行处理 } }); HttpUtil.sendOkHttpRequest(address, new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { //得到服务器返回的具体内容 String responseData = response.body().toString(); } @Override public void onFailure(Call call, IOException e) { //在这里对异常情况进行处理 } }); } }
package com.zjw.mynetwork8; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import okhttp3.OkHttpClient; import okhttp3.Request; /** * Created by hp on 2017/7/26. */ public class HttpUtil { public static void sendHttpRequest(final String address, final HttpCallbackListener httpCallbackListener) { new Thread(new Runnable() { @Override public void run() { HttpURLConnection httpURLConnection = null; try { URL url = new URL(address); httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(5000); httpURLConnection.setReadTimeout(5000); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); InputStream inputStream = httpURLConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } if (httpCallbackListener != null) { httpCallbackListener.onFinish(stringBuilder.toString()); } } catch (Exception e) { if (httpCallbackListener != null) { httpCallbackListener.onError(e); } } finally { if (httpURLConnection != null) { httpURLConnection.disconnect(); } } } }).start(); } public static void sendOkHttpRequest(String address, okhttp3.Callback callback) { OkHttpClient okHttpClient=new OkHttpClient(); Request request=new Request.Builder() .url(address) .build(); okHttpClient.newCall(request).enqueue(callback); } }