Android使用okhttp3和handler实现简单联网交互

配置

需要引入okhttp3的包

使用

不讲原理直接开干 这里介绍比较片面 有些方法并没有用到
想要了解更具体的原理和方法,自行查阅资料,这里只是使用工具的例子

创建一个异步操作的联网的工具包
HttpUtil.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* Created by cczhr on 2017/3/11.
*/
public class HttpUtil {
//get请求例子
public static void getSample(String address,String user,String password,String id,okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request=new Request.Builder()
.url(address+"?id="+id+"&&user="+user+"&&password="+password)
.build();
client. newCall(request).enqueue(callback);
}
//post 请求例子
public static void postSample(String address,String user,String password,okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
RequestBody requestBody=new FormBody.Builder()
.add("user",user)
.add("password",password)
.build();
Request request=new Request.Builder()
.url(url)
.post(requestBody)
.build();
client. newCall(request).enqueue(callback);
}
}

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//执行get请求 url,user,password,id在实际情况中要给值
HttpUtil.getSample(url,user,password,id, new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
//网络请求失败会执行的方法
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//网络请求成功会执行的方法
if (response!=null){
//下面是把请求网站后获取到的内容转换为字符串例子
InputStream inputStream=response.body().byteStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
StringBuilder result=new StringBuilder();
String line;
while ((line=reader.readLine())!=null){
result.append(line);
}
String date=(result.toString());
System.out.println(date);
//注意这里不能直接操作ui
//请求完毕后使用handler回到ui线程
Message message=new Message();
message.what=1;//后面的数字是随便定的 实际操作最好用一个常量
handler.sendMessage(message);
}
});
//post 请求也是一样的
HttpUtil.postSample(url,user,password,id, new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
//网络请求失败会执行的方法
}
@Override
public void onResponse(Call call, Response response) throws IOException {
.......
.......
.......
});

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
private Handler handler=new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
case 1:
//执行ui线程的操作 这里是弹出一个消息框
Toast.makeText(MainActivity.this, "操作成功", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};

当然最后别忘了给App联网权限
AndroidManifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.cczhr.httpdemo">
<!-- 联网权限-->
<uses-permission android:name="android.permission.INTERNET" />
<application>
......
......
......
</application>
</manifest>

Done!