Bladeren bron

add customize okhttp3 request 方法

yanyi 6 jaren geleden
bovenliggende
commit
a3d71ba6c5

+ 3 - 2
README.md

@@ -24,8 +24,9 @@ project 下添加
 #### 方法二(最新)
 module 下添加
 
-    compile 'com.yanyi.benyanyi:okhttplib:1.0.8'
+    compile 'com.yanyi.benyanyi:okhttplib:1.0.9'
     
 ### 更新记录
+* 2018/09/28(1.0.9) 添加自定义Request方法
+* 2018/09/14(1.0.8) 优化下载文件方法
 * 2018/09/12(1.0.7) 修复下载文件回调没返回问题,下载路径都是根目录下
-* 2018/09/14(1.0.8) 优化下载文件方法

+ 1 - 1
app/build.gradle

@@ -26,7 +26,7 @@ android {
 
 dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
-    implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
+    implementation 'com.android.support:appcompat-v7:28.0.0'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.2'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

+ 1 - 1
build.gradle

@@ -7,7 +7,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.1.4'
+        classpath 'com.android.tools.build:gradle:3.2.0'
         classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
         classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.3'
 

+ 2 - 2
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
-#Tue Sep 11 17:19:33 CST 2018
+#Fri Sep 28 15:56:37 CST 2018
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

+ 1 - 1
okhttplib/bintrayUpload.gradle

@@ -7,7 +7,7 @@ def siteUrl = 'https://github.com/BenYanYi/OkHttp' // 项目主页。
 def gitUrl = 'https://github.com/BenYanYi/OkHttp.git' // Git仓库的url。
 
 group = "com.yanyi.benyanyi"// 唯一包名,比如compile 'com.ansen.http:okhttpencapsulation:1.0.1'中的com.ansen.http就是这里配置的。
-version = "1.0.8"//项目引用的版本号,比如compile 'com.ansen.http:okhttpencapsulation:1.0.1'中的1.0.1就是这里配置的。
+version = "1.0.9"//项目引用的版本号,比如compile 'com.ansen.http:okhttpencapsulation:1.0.1'中的1.0.1就是这里配置的。
 install {
     repositories.mavenInstaller {
         // This generates POM.xml with proper parameters

+ 1 - 1
okhttplib/build.gradle

@@ -25,7 +25,7 @@ android {
 
 dependencies {
     implementation fileTree(include: ['*.jar'], dir: 'libs')
-    implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
+    implementation 'com.android.support:appcompat-v7:28.0.0'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.2'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

+ 49 - 0
okhttplib/src/main/java/com/mylove/okhttp/AutoIsRequest.java

@@ -0,0 +1,49 @@
+package com.mylove.okhttp;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+
+/**
+ * @author myLove
+ */
+
+public class AutoIsRequest {
+    @SuppressLint("StaticFieldLeak")
+    private static AutoIsRequest instance;
+    private static String url;
+    @SuppressLint("StaticFieldLeak")
+    private static Context mContext;
+
+    public static AutoIsRequest getInstance(Context context, String str) {
+        if (instance == null) {
+            synchronized (AutoIsRequest.class) {
+                if (instance == null) {
+                    instance = new AutoIsRequest();
+                }
+            }
+        }
+        mContext = context;
+        url = str;
+        return instance;
+    }
+
+    public void sync(onOkHttpCallBack onOkHttpCallBack) {
+        ObservableIsRequest.getInstance(mContext, CallType.SYNC).request(url, onOkHttpCallBack);
+    }
+
+    public <T> void sync(Class<T> tClass, onOkHttpCallBack onOkHttpCallBack) {
+        ObservableIsRequests request = ObservableIsRequests.getInstance(mContext, CallType.SYNC);
+        request.tClass = tClass;
+        request.request(url, onOkHttpCallBack);
+    }
+
+    public void async(onOkHttpCallBack onOkHttpCallBack) {
+        ObservableIsRequest.getInstance(mContext, CallType.ASYNC).request(url, onOkHttpCallBack);
+    }
+
+    public <T> void async(Class<T> tClass, onOkHttpCallBack onOkHttpCallBack) {
+        ObservableIsRequests request = ObservableIsRequests.getInstance(mContext, CallType.ASYNC);
+        request.tClass = tClass;
+        request.request(url, onOkHttpCallBack);
+    }
+}

+ 202 - 0
okhttplib/src/main/java/com/mylove/okhttp/ObservableIsRequest.java

@@ -0,0 +1,202 @@
+package com.mylove.okhttp;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.OkHttpClient;
+import okhttp3.Response;
+
+/**
+ * @author myLove
+ */
+
+class ObservableIsRequest {
+    @SuppressLint("StaticFieldLeak")
+    private static ObservableIsRequest instance;
+    @SuppressLint("StaticFieldLeak")
+    private static Context mContext;
+    private static CallType callType;
+
+    private static OkHttpClient okHttpClient;
+    private String mCacheUrl = "";
+
+    private onOkHttpCallBack okHttpCallBack;
+
+    static ObservableIsRequest getInstance(Context context, CallType type2) {
+        if (instance == null) {
+            synchronized (ObservableIsRequest.class) {
+                if (instance == null) {
+                    instance = new ObservableIsRequest();
+                    OkHttpClient httpClient = new OkHttpClient();
+                    okHttpClient = httpClient.newBuilder()
+                            .addNetworkInterceptor(new CacheInterceptor())
+                            .addInterceptor(Cache.HTTP_LOGGING_INTERCEPTOR)
+                            .cache(Cache.privateCache(context))
+                            .connectTimeout(30, TimeUnit.SECONDS)
+                            .readTimeout(30, TimeUnit.SECONDS)
+                            .build();
+                }
+            }
+        }
+        mContext = context;
+        callType = type2;
+        return instance;
+    }
+
+    void request(String url, onOkHttpCallBack onOkHttpCallBack) {
+        this.okHttpCallBack = onOkHttpCallBack;
+        getObservable(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+                .serialize()//保证上游下游同一线程 ,防止不同线程下 onError 通知会跳到(并吞掉)原始Observable发射的数据项前面的错误行为
+                .subscribe(new Observer<String>() {
+                    @Override
+                    public void onSubscribe(Disposable d) {
+
+                    }
+
+                    @Override
+                    public void onNext(String str) {
+                        okHttpCallBack.onSuccess(str);
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        okHttpCallBack.onFailure(e);
+                    }
+
+                    @Override
+                    public void onComplete() {
+                        okHttpCallBack.onCompleted();
+                    }
+                });
+    }
+
+    private Observable<String> getObservable(final String url) {
+
+        return Observable.create(new ObservableOnSubscribe<String>() {
+            @Override
+            public void subscribe(ObservableEmitter<String> e) {
+                send(url, e);
+            }
+        });
+    }
+
+    private void send(String url, ObservableEmitter<String> subscriber) {
+        mCacheUrl = url;
+        InternetBean bean = Internet.ifInternet(mContext);
+        if (bean.getStatus()) {
+            Call call = okHttpClient.newCall(okHttpCallBack.setRequest(url));
+            sendCall(call, subscriber);
+        } else {
+            String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+            if (FormatUtil.isNotEmpty(json)) {
+                subscriber.onNext(json);
+                subscriber.onComplete();
+            } else {
+                subscriber.onError(new Error(bean.getMsg()));
+                subscriber.onComplete();
+            }
+        }
+
+    }
+
+    /**
+     * 请求
+     */
+    private void sendCall(Call call, ObservableEmitter<String> subscriber) {
+        if (callType == CallType.SYNC) {
+            sync(call, subscriber);
+        } else if (callType == CallType.ASYNC) {
+            async(call, subscriber);
+        }
+    }
+
+    /**
+     * 同步请求
+     */
+    private void sync(Call call, ObservableEmitter<String> subscriber) {
+        try {
+            Response execute = call.execute();
+            if (execute.isSuccessful()) {
+                String str = execute.body().string();
+                if (OkHttpInfo.isLOG) {
+                    Log.v(OkHttpInfo.TAG, str);
+                }
+                if (!str.toUpperCase().contains("<!DOCTYPE HTML>")) {
+                    if (FormatUtil.isNotEmpty(mCacheUrl)) {
+                        CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
+                    }
+                }
+                subscriber.onNext(str);
+                subscriber.onComplete();
+            } else {
+                String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+                if (FormatUtil.isNotEmpty(json)) {
+                    subscriber.onNext(json);
+                    subscriber.onComplete();
+                } else {
+                    subscriber.onError(new Exception("请求失败"));
+                    subscriber.onComplete();
+                }
+            }
+        } catch (IOException e) {
+            String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+            if (FormatUtil.isNotEmpty(json)) {
+                subscriber.onNext(json);
+                subscriber.onComplete();
+            } else {
+                subscriber.onError(e);
+                subscriber.onComplete();
+            }
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 异步请求
+     */
+    private void async(Call call, final ObservableEmitter<String> subscriber) {
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(@NonNull Call call, @NonNull IOException e) {
+                String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+                if (FormatUtil.isNotEmpty(json)) {
+                    subscriber.onNext(json);
+                    subscriber.onComplete();
+                } else {
+                    subscriber.onError(e);
+                    subscriber.onComplete();
+                }
+                e.printStackTrace();
+            }
+
+            @Override
+            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+                String str = response.body().string();
+                if (OkHttpInfo.isLOG) {
+                    Log.v(OkHttpInfo.TAG, str);
+                }
+                if (!str.toUpperCase().contains("<!DOCTYPE HTML>")) {
+                    if (FormatUtil.isNotEmpty(mCacheUrl)) {
+                        CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
+                    }
+                }
+                subscriber.onNext(str);
+                subscriber.onComplete();
+            }
+        });
+    }
+}

+ 227 - 0
okhttplib/src/main/java/com/mylove/okhttp/ObservableIsRequests.java

@@ -0,0 +1,227 @@
+package com.mylove.okhttp;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import com.google.gson.Gson;
+
+import org.json.XML;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.Observer;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.OkHttpClient;
+import okhttp3.Response;
+
+/**
+ * @author myLove
+ */
+
+class ObservableIsRequests<T> {
+    @SuppressLint("StaticFieldLeak")
+    private static ObservableIsRequests instance;
+    @SuppressLint("StaticFieldLeak")
+    private static Context mContext;
+    private static CallType callType;
+
+    private static OkHttpClient okHttpClient;
+    private String mCacheUrl = "";
+
+    private onOkHttpCallBack okHttpCallBack;
+
+    public Class<T> tClass;
+
+    static ObservableIsRequests getInstance(Context context, CallType type2) {
+        if (instance == null) {
+            synchronized (ObservableIsRequests.class) {
+                if (instance == null) {
+                    instance = new ObservableIsRequests();
+                    OkHttpClient httpClient = new OkHttpClient();
+                    okHttpClient = httpClient.newBuilder()
+                            .addNetworkInterceptor(new CacheInterceptor())
+                            .addInterceptor(Cache.HTTP_LOGGING_INTERCEPTOR)
+                            .cache(Cache.privateCache(context))
+                            .connectTimeout(30, TimeUnit.SECONDS)
+                            .readTimeout(30, TimeUnit.SECONDS)
+                            .build();
+                }
+            }
+        }
+        mContext = context;
+        callType = type2;
+        return instance;
+    }
+
+    void request(String url, onOkHttpCallBack onOkHttpCallBack) {
+        this.okHttpCallBack = onOkHttpCallBack;
+        getObservable(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+                .serialize().subscribe(new Observer<T>() {
+            @Override
+            public void onSubscribe(Disposable d) {
+
+            }
+
+            @Override
+            public void onNext(T t) {
+                okHttpCallBack.onSuccess(t);
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                okHttpCallBack.onFailure(e);
+            }
+
+            @Override
+            public void onComplete() {
+                okHttpCallBack.onCompleted();
+            }
+        });
+    }
+
+    private Observable<T> getObservable(final String url) {
+        return Observable.create(new ObservableOnSubscribe<T>() {
+            @Override
+            public void subscribe(ObservableEmitter<T> e) {
+                send(url, e);
+            }
+        });
+    }
+
+    private void send(String url, ObservableEmitter<T> subscriber) {
+        mCacheUrl = url;
+        InternetBean bean = Internet.ifInternet(mContext);
+        if (bean.getStatus()) {
+            Call call = okHttpClient.newCall(okHttpCallBack.setRequest(url));
+            sendCall(call, subscriber);
+        } else {
+            String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+            if (FormatUtil.isNotEmpty(json)) {
+                T t = new Gson().fromJson(json, tClass);
+                subscriber.onNext(t);
+                subscriber.onComplete();
+            } else {
+                subscriber.onError(new Error(bean.getMsg()));
+                subscriber.onComplete();
+            }
+        }
+    }
+
+    /**
+     * 请求
+     */
+    private void sendCall(Call call, ObservableEmitter<T> subscriber) {
+        if (callType == CallType.SYNC) {
+            sync(call, subscriber);
+        } else if (callType == CallType.ASYNC) {
+            async(call, subscriber);
+        }
+    }
+
+    /**
+     * 同步请求
+     */
+    private void sync(Call call, ObservableEmitter<T> subscriber) {
+        try {
+            Response execute = call.execute();
+            if (execute.isSuccessful()) {
+                String str = execute.body().string();
+                if (OkHttpInfo.isLOG) {
+                    Log.v(OkHttpInfo.TAG, str);
+                }
+                if ((str.substring(0, 1).equals("<") || str.substring(0, 1).equals("["))
+                        && (str.substring(1, 2).equals("\"") || str.substring(1, 2).equals("["))) {
+                    try {
+                        str = XML.toJSONObject(str).toString();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    if (!str.toUpperCase().contains("<!DOCTYPE HTML>")) {
+                        if (FormatUtil.isNotEmpty(mCacheUrl)) {
+                            CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
+                        }
+                    }
+                }
+                T t = new Gson().fromJson(str, tClass);
+                subscriber.onNext(t);
+                subscriber.onComplete();
+            } else {
+                String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+                if (FormatUtil.isNotEmpty(json)) {
+                    T t = new Gson().fromJson(json, tClass);
+                    subscriber.onNext(t);
+                    subscriber.onComplete();
+                } else {
+                    subscriber.onError(new Exception("请求失败"));
+                    subscriber.onComplete();
+                }
+            }
+        } catch (IOException e) {
+            String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+            if (FormatUtil.isNotEmpty(json)) {
+                T t = new Gson().fromJson(json, tClass);
+                subscriber.onNext(t);
+                subscriber.onComplete();
+            } else {
+                subscriber.onError(e);
+                subscriber.onComplete();
+            }
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 异步请求
+     */
+    private void async(Call call, final ObservableEmitter<T> subscriber) {
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(@NonNull Call call, @NonNull IOException e) {
+                String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
+                if (FormatUtil.isNotEmpty(json)) {
+                    T t = new Gson().fromJson(json, tClass);
+                    subscriber.onNext(t);
+                    subscriber.onComplete();
+                } else {
+                    subscriber.onError(e);
+                    subscriber.onComplete();
+                }
+                e.printStackTrace();
+            }
+
+            @Override
+            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+                String str = response.body().string();
+                if (OkHttpInfo.isLOG) {
+                    Log.v(OkHttpInfo.TAG, str);
+                }
+                if ((str.substring(0, 1).equals("<") || str.substring(0, 1).equals("["))
+                        && (str.substring(1, 2).equals("\"") || str.substring(1, 2).equals("["))) {
+                    try {
+                        str = XML.toJSONObject(str).toString();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    if (!str.toUpperCase().contains("<!DOCTYPE HTML>")) {
+                        if (FormatUtil.isNotEmpty(mCacheUrl)) {
+                            CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
+                        }
+                    }
+                }
+                T t = new Gson().fromJson(str, tClass);
+                subscriber.onNext(t);
+                subscriber.onComplete();
+            }
+        });
+    }
+}

+ 4 - 0
okhttplib/src/main/java/com/mylove/okhttp/OkHttpUtil.java

@@ -45,6 +45,10 @@ public class OkHttpUtil {
         return AutoRequest.getInstance(mContext, url, RequestType.UP_FILE);
     }
 
+    public AutoIsRequest send(String url) {
+        return AutoIsRequest.getInstance(mContext, url);
+    }
+
     public DownloadRequest downloadFile(String url) {
         return DownloadRequest.getInstance(mContext, url);
     }

+ 13 - 0
okhttplib/src/main/java/com/mylove/okhttp/onOkHttpCallBack.java

@@ -0,0 +1,13 @@
+package com.mylove.okhttp;
+
+import okhttp3.Request;
+
+/**
+ * @author BenYanYi
+ * @date 2018/9/28 15:36
+ * @email ben@yanyi.red
+ * @overview
+ */
+public interface onOkHttpCallBack extends onOkHttpListener {
+    Request setRequest(String url);
+}