OkGo的主要功能:
基本的get、post、put、delete、head、options、trace、patch八种请求
支持upString,upJson,upBytes,upFile等up类方法上传特定数据
支持一个key上传一个文件,也可以一个key上传多个文件,也可以多文件和多参数一起上传
大文件下载和下载进度回调
大文件上传和上传进度回调
支持自定义超时自动重连次数
支持https访问,支持双向认证
支持根据tag取消请求,也可全部取消
支持自定义Callback,自动解析网络数据
OkGo请求所有配置
1、第一行的泛型一定要特别注意,这个表示你请求网络的数据类型是什么,必须指定,否则无法解析网络数据。
.post(url):这个表示当前请求是post请求,当然一共支持GET,HEAD,OPTIONS,POST,PUT,DELETE, PATCH, TRACE这8种请求方式
2、params():添加参数的时候,最后一个isReplace为可选参数,默认为true,代表相同key的时候,后添加的会覆盖先前添加的。
3、tag(this):请求的tag,用于标识当前的请求,方便后续取消对应的请求,如果你不需要取消请求,也可以不用设置。
4、isMultipart():该方法表示是否强制使用multipart/form-data表单上传,因为该框架在有文件的时候,无论你是否设置这个参数,默认都是multipart/form-data格式上传,但是如果参数中不包含文件,默认使用application/x-www-form-urlencoded格式上传,如果你的服务器要求无论是否有文件,都要使用表单上传,那么可以用这个参数设置为true。
5、isSpliceUrl():该方法表示是否强制将params的参数拼接到url后面,默认false不拼接。一般来说,post、put等有请求体的方法应该把参数都放在请求体中,不应该放在url上,但是有的服务端可能不太规范,url和请求体都需要传递参数,那么这时候就使用该参数,他会将你所有使用.params()方法传递的参数,自动拼接在url后面。
6、retryCount():该方法是配置超时重连次数,也可以在全局初始化的时候设置,默认使用全局的配置,即为3次,你也可以在这里为你的这个请求特殊配置一个,并不会影响全局其他请求的超时重连次数。
7、cacheKey() .cacheTime() .cacheMode():这三个是缓存相关的配置,详细请看缓存介绍
8、headers():该方法是传递服务端需要的请求头,如果你不知道什么是请求头,看wiki首页关于网络抓包中的http协议链接。
9、params():该方法传递键值对参数,格式也是http协议中的格式,详细参考上面的http协议连接。
10、addUrlParams() .addFileParams() .addFileWrapperParams():这里是支持一个key传递多个文本参数,也支持一个key传递多个文件参数,详细也看上面的http协议连接。
OkGo的回调方法
如何使用OkGo网络请求方式来下载文件呢?
附上Demo
首先创建一个全局的Application
package com.example.administrator.okgo_demo;
import android.app.Application;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.model.HttpHeaders;
import com.lzy.okgo.model.HttpParams;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
public class Gss_Application extends Application {
@Override
public void onCreate() {
super.onCreate();
//headers不支持中文参数
HttpHeaders headers = new HttpHeaders();
headers.put("commonHeaderKey1","commonHeaderValue1");
headers.put("commonHeaderKey2","commonHeaderValue2");
//params支持中文参数
HttpParams params = new HttpParams();
params.put("commonHeaderKey1","commonHeaderValue1");
params.put("commonHeaderKey2","支持中文参数");
//设置超时的时间。默认为60s
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(OkGo.DEFAULT_MILLISECONDS,TimeUnit.SECONDS);
builder.writeTimeout(OkGo.DEFAULT_MILLISECONDS,TimeUnit.SECONDS);
builder.connectTimeout(OkGo.DEFAULT_MILLISECONDS,TimeUnit.SECONDS);
//初始化
OkGo.getInstance().init(this)
.setOkHttpClient(builder.build())
.setCacheMode(CacheMode.NO_CACHE) //全局统一缓存,默认不做缓存
.setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE) //全局统一,默认时间为60s
.setRetryCount(3) //全局设置统一超时时间,默认重连三次
.addCommonHeaders(headers) //全局的公共头
.addCommonParams(params); //全局的公共参数
// OkGo.getInstance().init(this);
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn_get"
android:text="@string/get"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/pro_bar"
android:layout_width="match_parent"
android:max="100"
android:background="#eed222"
android:layout_height="6dp" />
<TextView
android:id="@+id/tv_iew"
android:layout_width="match_parent"
android:layout_height="1dp" />
<ImageView
android:id="@+id/img_View"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
主代码
package com.example.administrator.okgo_demo;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;
import com.lzy.okgo.model.Progress;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.request.base.Request;
import java.io.File;
import java.net.URL;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final String URL = "http://cdn.duitang.com/uploads/item/201406/18/20140618224720_S2YVv.jpeg";
final String destfiledir = Environment.getExternalStorageDirectory().getPath() + "/AaaaaAAAaaA";//下载路径
public static final String TAG = "MainActivity-vv";
private Button btn_get;
private ImageView img_View;
private ProgressBar progressBar;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
btn_get = findViewById(R.id.btn_get);
img_View = findViewById(R.id.img_View);
progressBar = findViewById(R.id.pro_bar);
textView = findViewById(R.id.tv_iew);
btn_get.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_get:
OkGo.<File>get(URL)
.execute(new FileCallback(destfiledir,"Download_image") {
@Override
public void onSuccess(Response<File> response) {
Log.d(TAG,"Download Suc");
Log.d(TAG, "onSuccess: "+destfiledir);
}
@Override
public void onStart(Request<File, ? extends Request> request) {
super.onStart(request);
Log.d(TAG, "正在加载....");
}
@Override
public void downloadProgress(Progress progress) {
super.downloadProgress(progress);
long totalSize = progress.totalSize;//总长度
long currentSize = progress.currentSize;//本次下载的大小
//进度条
progressBar.setMax((int) totalSize);
progressBar.setProgress((int) currentSize);
textView.setText(String.valueOf(progress.fraction * 100 + "%")); //下载进度
}
@Override
public void onError(Response<File> response) {
super.onError(response);
Log.d(TAG, "onError: Fail");
}
@Override
public void onFinish() {
super.onFinish();
Log.d(TAG, "onFinish: 结束");
}
});
break;
}
}
}
点击button就可以下载对应的URL文件了,下载好的文件在这里查看,如图