太久没有写过东西了。这几年没有总结浪费时间,回到正题。
OkHttp 一款网络请求库或者说一个漂亮的网络请求第三方请求库。这里面说的都是OkHttp3 ,因为今天OkHttp2已经是过去了。就想我开始做Android的时候是基于2.2开发一样,老的不能在老了一样,会被人慢慢遗忘。
引用OkHttp3 步骤简单
Android Studio 配置gradle:
别忘记Android的网络权限,这个东西十分讨厌很容易忘记,然后在测试的时候一看错误就是一拍大腿,我去 这个我也能忘 哈哈 毕竟开发一款APP就只写一次。不过现在应该好了6.0的系统让我们不在可能忘记了。动态权限来了~ 又扯远了
<uses-permissionandroid:name="android.permission.INTERNET"/>
读写权限也添加上去,网络请求有时候需要缓存GET请求数据。
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
OkHttpClient是我们使用OkHttp3的初始化对象,看这个字面的意思很好理解。一个客户端,一个连接服务器的客户端。第一个反应就是他不用每次都创建他。那么一个APP可以维护一个这样的对象就可以了。这样的对象我们可以单例使用。如下:
public class OkHttpEngine {
private static OkHttpEngine mInstance;
private OkHttpClient mOkHttpClient;
private Handler mHandler;
public static OkHttpEngine getInstance() {
if (mInstance == null) {
synchronized (OkHttpEngine.class) {
if (mInstance == null) {
mInstance = new OkHttpEngine();
}
}
}
return mInstance;
}
private OkHttpEngine() {
mOkHttpClient = new OkHttpClient();
//下面的设置是连接时间和读写时间
mOkHttpClient.setConnectTimeout(15, TimeUnit.SECONDS);
mOkHttpClient.setWriteTimeout(20, TimeUnit.SECONDS);
mOkHttpClient.setReadTimeout(20, TimeUnit.SECONDS);
mHandler = new Handler();
}
//设置网络请求数据缓存位置和大小,缓存的数据一般都是GET类型的请求,这种类型数据改变的情况比较小
public OkHttpEngine setCache(Context mContext) {
File sdcache = mContext.getExternalCacheDir();
int cacheSize = 10 * 1024 * 1024;
mOkHttpClient.setCache(new Cache(sdcache.getAbsoluteFile(), cacheSize));
return mInstance;
}
}
好了初始化,完成我们来GET请求实例
无论请求类型是什么,OkHttp3都是通过Request.Builder来创建一Request的。这里有一点默认请求就是GET类型所以不需要设置
Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");
//下面的这句在GET请求的使用就变得可有可无了
requestBuilder.method("GET",null);
Request request = requestBuilder.build();
创建一个请求回调对象
Call mcall= mOkHttpClient.newCall(request);
开始执行请求
call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { //请求失败回调 } @Override public void onResponse(final Response response) throws IOException { //请求成功回调,回调并不是在UI线程,这一点有好处也有坏处。毕竟大多数的数据都是直接就可以使用的 } });
因为GET请求的数据有可能是缓存数据在onResponse回调里面是通过
if(null == response.cacheResponse())
来判断缓存是否有数据的。
同时在请求的时候我们也可以通过配置来控制是否使用缓存数据的时间,也就是缓存数据的生命周期时间。OkHttp3提供了几种可能
请求的时候设置保存数据多久,cache_maxAge_inseconds 缓存最大生存时间,单位为秒,这样的请求会自动将数据缓存起来,如果数据超过缓存最大时间则删除数据
Request.Builder requestBuilder = new Request.Builder().cacheControl(new CacheControl.Builder().maxAge(cache_maxAge_inseconds, TimeUnit.SECONDS).build()).url("http://www.baidu.com");
请求时候设置过时时间staletime 过时时间,秒为单位
Request.Builder requestBuilder = new Request.Builder().cacheControl(new CacheControl.Builder().maxStale(staletime, TimeUnit.SECONDS).build()).url("http://www.baidu.com");
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "wangshu")
.addFormDataPart("image", "wangshu.jpg",
RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/test.jpg")))
.build();
Request request = new Request.Builder()
.header("Authorization", "Client-ID " + "...")
.url("https://api.imgur.com/3/image")
.post(requestBody)
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("tianzhw", response.body().string());
}
});
POST上传一个文件
public static final MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse("text/x-markdown; charset=utf-8");
mOkHttpClient=new OkHttpClient();
File file = new File("/sdcard/wangshu.txt");
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("tianzhw",response.body().string());
}
});
下载一个文件
mOkHttpClient = new OkHttpClient();
String url = "http://xxx/test.jpg";
Request request = new Request.Builder().url(url).build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) {
InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(new File("/sdcard/tianzhw.jpg"));
byte[] buffer = new byte[2048];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.flush();
} catch (IOException e) {
Log.i("wangshu", "IOException");
e.printStackTrace();
}
Log.d("wangshu", "文件下载成功");
}
});