对于 Android 开发来说,网络请求是必不可少的一件事情,但想要自己开发一个合适又好用的网络请求框架,对于一般人来说这是一件很难实现的事。毕竟在网络请求的过程中有很多因素需要你考虑到。而且目前 Git 上提供了许多好用又方便的第三方框架让你可以更快更简单的实现网络请求的功能。OkHttp 是目前市场上主流的网络请求第三方框架,它可以让你很轻易的实现许多你想要的网络请求,如:配置网络请求缓存区,处理各种请求结果 等等。。。
OkHttp 使用起来也非常简单快速,首先添加它的依赖:
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.7.0'
创建一个 OkHttpUtils 网络请求工具类:(这里只是提供了 GET 方法的实现)
import java.io.File;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* Created by ZY on 2017/6/1.
*/
public class OkHttpUtil {
public OkHttpUtil(){
}
/**
* 通过get来获取网络数据
* @param file 缓存区文件
* @param url 链接地址
* @param callback 请求后的回调
*/
public static void getOkHttp(File file, String url, Callback callback){
int cacheSize=10*1024*1024;//设置缓存区大小
OkHttpClient.Builder clientBuilder=new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)//连接超时时间设置
.readTimeout(5,TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(5,TimeUnit.SECONDS)//设置写入超时时间
.cache(new Cache(file.getAbsoluteFile(),cacheSize));//设置缓存大小
OkHttpClient okHttpClient=clientBuilder.build();//通过builder来创建客户端实例
Request.Builder builder=new Request.Builder()//初始化Request的Builder实例
.url(url);//设置url
builder.method("GET",null);//设置请求方法为 GET(默认为 GET)
Request request=builder.build();//通过builder得到Request实例
Call call=okHttpClient.newCall(request);//通过客户端得到call实例
call.enqueue(callback);//发起网络请求并且通过callback来操作返回的结果
}
}
最后在需要使用的地方直接使用工具类进行网络请求就好了:(OkHttp 内部实现了在子线程中请求,所以不需要开子线程)
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;
import java.io.File;
import java.io.IOException;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
@BindView(R.id.main_get_image_btn)
Button mainGetImageBtn;
private String url;//声明地址url
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.main_get_image_btn)
public void onClick() {
url = "https://www.baidu.com";//url百度地址
File cache = getExternalCacheDir();//缓存文件
OkHttpUtil.getOkHttp(cache, url, new Callback() {//请求回调
@Override
public void onFailure(Call call, IOException e) {//请求失败
Log.d("rongjie", "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {//请求成功
Log.d("rongjie", "onResponse: " + response.networkResponse());
}
});
}
}
这样一个简单的通过 OkHttp 的GET 请求就实现了 。
ps:别忘了网络权限的开启