1、说明:所有的内容都在源代码里面,欢迎学习交流
//学习笔记[备查]
/* 参考资料(《第一行代码》 第二版)
程序功能:将通用的网络操作(HttpURLConnection 和 OkHttp)进行封装, 然后进行测试
代码内容:
1、实现HttpURLConnection网络操作的封装 接口 HttpCallbackListener 和方法sendHttpRequest()
2、实现OkHttp网络操作的封装 方法sendOkHttpRequest()
3、在MainActivity当中进行测试
注意事项:
1、记得在Gradle 中添加 Google的OkHttp compile 'com.squareup.okhttp3:okhttp:3.8.1'
2、记得申请网络连接权限 <uses-permission android:name="android.permission.INTERNET"/>
额外学到的内容:
1、HttpURLConnection中 回调机制的使用
2、网络请求需要开启子线程 , 子线程当中不能return
*/
2、Mainactivity.java
package com.lfork.a98620.networkbestpractice;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用HttpConnection封装的代码进行网络请求
HttpUtil.sendHttpRequest("https://www.baidu.com", new HttpCallbackListener() {
@Override
public void onFinish(String response) {
//在这里根据返回的内容执行具体的逻辑
Log.d(TAG, "onFinish: 返回的内容如下:" + response);
}
@Override
public void onError(Exception e) {
//异常处理
Log.d(TAG, "onError: 错误信息如下:" + e);
}
});
//调用OkHttp封装的代码进行网络请求
HttpUtil.sendOkHttpRequest("https://www.baidu.com", new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
//异常处理
//错误信息如下
Log.d(TAG, "onFailure: 错误信息如下:" + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//得到服务器返回的neir
String responseData = response.body().toString();
Log.d(TAG, "onResponse: 返回的内容如下:" + response);
}
});
}
}
3、HttpUtil.java
package com.lfork.a98620.networkbestpractice;
///**
// * Created by 98620 on 2017/8/15.
// */
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;
public class HttpUtil {
/* 将HttpUrlConnection的网络操作进行封装
1、程序功能:将通用的网络操作(HttpURLConnection 和 OkHttp)进行封装
2、子线程和回调机制的使用:网络操作是耗时操作。所以需要开启一个子线程来进行,并且还要使用Java的回调机制来返回数据
3、GET:
子线程是无法通过return语句来返回数据的
*/
public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
//GET 表示获取数据 POST表示发送数据
connection.setRequestMethod("GET");
//设置连接超时的时间
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
//下面对获取到的输入流进行读取
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
/*子线程是无法通过return语句来返回数据的,并且这里的返回值也设置为空了
所以这里需要把数据传入到HttpCallbackListener的OnFinish()方法中
*/
if (listener != null) {
//回调Onfinish方法
listener.onFinish(response.toString());
}
} catch (Exception e) {
if (listener != null) {
listener.onError(e);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
/* 将OkHttp进行封装 只有3行......
*/
public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}
4、HttpCallbackListener.java 接口定义
package com.lfork.a98620.networkbestpractice;
///**
// * Created by 98620 on 2017/8/15.
// */
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}