android okhttp 异步请求使用详解 (2)
post 提交请求](about:blank#2post_84)
=====================================================================
OkHttp 是一款高效的 HTTP 客户端,内部依赖 okio,它有以下优点:
HTTP/2 支持允许对同一主机的所有请求共享同一个 socket。
连接池可减少请求延迟(如果 HTTP/2 不可用)。
透明 GZIP 可缩小下载大小。
响应缓存可完全避免重复请求的网络。
OkHttp 3.12.x 及以下的版本支持 Android 2.3+(API 级别 9+)和 Java 7+。同时还要导入 okhttp 依赖的 okio 库,而 Okio 在 1.x 版本是基于 Java 实现的,2.x 则是 Kotlin 实现的。这里我的 Android 版本是 2.3,基于 Java 实现。
在项目中的 app 目录下的 build.gradle 文件中添加以下代码
dependencies { // okhttp3 的依赖
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.squareup.okio:okio:1.12.0'}
在 AndroidManifest.xml 中添加网络权限 :
<uses-permission android:name="android.permission.INTERNET"/>
联网请求文本数据
大文件下载上传
请求图片
=======================================================================
布局文件很简单,只有几个按钮
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity ";
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn= (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
getRequest("http://api.m.mtime.cn/PageSubArea/TrailerList.api");
}catch(IOException e)
{
e.printStackTrace();
}
}
});
}
/*
get 请求
url 网络连接
*/
public void getRequest(String url) throws IOException {
//要有一个客户端,类似于要有一个浏览器
OkHttpClient client = new OkHttpClient.Builder()
.build();
//创建请求内容
Request request = new Request.Builder()
.get()
.url(url)
.build();
//用 client 去创建请求任务
okhttp3.Call task=client.newCall(request);
//异步请求,发起请求可以继续做其他事情(同步请求,发起请求之后要等数据回来)
task.enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
Log.d(TAG,"onFailure->"+e.toString());
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
ResponseBody body=response.body();
Log.d(TAG,"onSuccess->"+body.string());
}
});
}
}
运行结果,点击按钮后,logcat 打印出获取的内容
post 请求和 get 请求不同的是 post 需要一个 RequestBody 的参数。RequestBody 是一个抽象类,分别有 FormBody 和 MultipartBody 两个子类。FormBody,用于传输表单类型的参数。MultipartBody 则支持多类型的参数传递。
public void post(String url){
评论