OkHttp
什麼是OkHttp?
okhttp是一個第三方類庫,用於android中請求網絡。
這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary) 。用於替代HttpUrlConnection和Apache HttpClient(android API23 裏已移除HttpClient)。
Tips
使用時需導入依賴:
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
需要使用Handle來更新UI
GET請求
public void getjson(){
//TODO 1:client對象
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.callTimeout(5, TimeUnit.SECONDS);//連接超時
builder.readTimeout(5,TimeUnit.SECONDS);//讀取超時
OkHttpClient client = builder.build();
//TODO 2:request對象
Request.Builder builder1 = new Request.Builder();
builder1.url("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&");//設置網址
builder1.get();//設置請求方法
Request request = builder1.build();
//TODO 3:發起連接call
Call call = client.newCall(request);
//TODO 4:通過call得到response
call.enqueue(new Callback() {
//請求失敗
@Override
public void onFailure(Call call, IOException e) {
}
//請求成功
@Override
public void onResponse(Call call, Response response) throws IOException {
//獲得響應體:json串
ResponseBody body = response.body();
//通過body直接轉成字符串
String json = body.string();
// Toast.makeText(MainActivity.this, ""+json, Toast.LENGTH_SHORT).show();
Message obtain = Message.obtain();
obtain.what=GET_JSON_OK;
obtain.obj=json;
handler.sendMessage(obtain);
}
});
}
POST請求
private void post() {
OkHttpClient client = new OkHttpClient.Builder()
.callTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();
//完成請求體:
FormBody formBody = new FormBody.Builder()
.add("phone", "13594343356")
.add("passwd", "123654")
.build();
final Request request = new Request.Builder()
.url("https://www.apiopen.top/createUser?key=00d91e8e0cca2b76f515926a36db68f5&")
.post(formBody)//post提交必須要設置請求體
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Message obtain = Message.obtain();
obtain.what=GET_JSON_OK;
obtain.obj=string;
handler.sendMessage(obtain);
}
});
}
下載文件
public void downLoad() {
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder()
.get()
.url("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4 ")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
long l = response.body().contentLength();//獲得返回數據的總大小
InputStream inputStream = response.body().byteStream();//轉換成字節流
FileOutputStream fileOutputStream = new FileOutputStream(new File("/sdcard/DCIM/monkey.mp4"));
byte[] b = new byte[1024];
int len = 0;
int count = 0;
while ((len = inputStream.read(b))!=-1){
fileOutputStream.write(b,0,len);
count+=len;
final int progress = (int)(count*100/l);
//handler更新UI
handler.post(new Runnable() {
@Override
public void run() {
if (progress == 100){
mBar.setProgress(100);
Toast.makeText(MainActivity.this, "下載完成", Toast.LENGTH_SHORT).show();
}
else {
mBar.setProgress(progress);
}
}
});
}
}
});
}
});
上傳文件
public void upLoad() {
OkHttpClient client = new OkHttpClient.Builder()
.callTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();
//上傳文件的請求體
MultipartBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "倒數.mp3",RequestBody.create(MediaType.parse("media/mp3"), new File("/sdcard/Music/G.E.M. 鄧紫棋 - 倒數.mp3")))
.build();
final Request request = new Request.Builder()
.url("http://169.254.220.85/czp666/")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
});
}
單例模式完成以上操作:
回調接口
public interface OkListener {
public void yes(String msg);//成功調用的方法
public void no(String msg);//失敗調用的方法
}
HttpUtils
//懶漢單例
public class OkhttpUtils {
private OkHttpClient client = null;
public static final int TIME = 60;
public Handler handler = new Handler();
public static OkhttpUtils okhttpUtils = null;
//空參構造
private OkhttpUtils() {
client = new OkHttpClient.Builder()
.build();
}
//雙層校驗
public static OkhttpUtils getInstance(){
if (okhttpUtils == null){
synchronized (Object.class){
if (okhttpUtils == null){
okhttpUtils = new OkhttpUtils();
}
}
}
return okhttpUtils;
};
//GET
public void doGet(String url, final OkListener okListener){
final Request request = new Request.Builder()
.url(url)
.get()
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
if (okListener!=null){
handler.post(new Runnable() {
@Override
public void run() {
okListener.no(message);
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String string = response.body().string();
if (okListener!=null){
handler.post(new Runnable() {
@Override
public void run() {
okListener.yes(string);
}
});
}
}
});
}
//POST
public void doPost(String post_url, HashMap<String,String> map, final OkListener okListener){
FormBody.Builder builder = new FormBody.Builder();
Set<Map.Entry<String, String>> entries = map.entrySet();//鍵直對的集合
for (Map.Entry<String, String> entry : entries) {
builder.add(entry.getKey(),entry.getValue());
}
FormBody formBody = builder.build();
Request request = new Request.Builder()
.post(formBody)
.url(post_url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
if (okListener!=null){
handler.post(new Runnable() {
@Override
public void run() {
okListener.no(message);
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String string = response.body().string();
if (okListener!=null){
handler.post(new Runnable() {
@Override
public void run() {
okListener.yes(string);
}
});
}
}
});
}
}
//DOWNLOAD
public void doDown(String picurl, final String title, final OkListener okListener){
Request request = new Request.Builder()
.get()
.url(picurl)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
handler.post(new Runnable() {
@Override
public void run() {
okListener.no(message);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();//轉換成字節流
FileOutputStream fileOutputStream = new FileOutputStream(new File(title));
byte[] b = new byte[1024];
int len = 0;
while ((len = inputStream.read(b))!=-1){
fileOutputStream.write(b,0,len);
}
handler.post(new Runnable() {
@Override
public void run() {
okListener.yes("OK");
}
});
}
});
}
//upload
public void doUp(String picpath, final String title, final OkListener okListener){
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
builder.addFormDataPart("file",title, RequestBody.create(MediaType.parse("media/jpg"),new File(picpath)));
MultipartBody body = builder.build();
Request request = new Request.Builder()
.post(body)
.url("http://192.168.43.145/czp666/")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
handler.post(new Runnable() {
@Override
public void run() {
okListener.no(message);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();//轉換成字節流
FileOutputStream fileOutputStream = new FileOutputStream(new File(title));
byte[] b = new byte[1024];
int len = 0;
while ((len = inputStream.read(b))!=-1){
fileOutputStream.write(b,0,len);
}
handler.post(new Runnable() {
@Override
public void run() {
okListener.yes("OK");
}
});
}
});
}
}
MainActivity
MainActivity中使用HttpUtils對象點所需方法,穿所需要的參數及new一個回調接口來完成操作