ObservableIsRequests.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package com.mylove.okhttp;
  2. import android.annotation.SuppressLint;
  3. import android.content.Context;
  4. import android.support.annotation.NonNull;
  5. import android.util.Log;
  6. import com.google.gson.Gson;
  7. import org.json.XML;
  8. import java.io.IOException;
  9. import java.util.concurrent.TimeUnit;
  10. import io.reactivex.Observable;
  11. import io.reactivex.ObservableEmitter;
  12. import io.reactivex.ObservableOnSubscribe;
  13. import io.reactivex.Observer;
  14. import io.reactivex.android.schedulers.AndroidSchedulers;
  15. import io.reactivex.disposables.Disposable;
  16. import io.reactivex.schedulers.Schedulers;
  17. import okhttp3.Call;
  18. import okhttp3.Callback;
  19. import okhttp3.OkHttpClient;
  20. import okhttp3.Response;
  21. /**
  22. * @author myLove
  23. */
  24. class ObservableIsRequests<T> {
  25. @SuppressLint("StaticFieldLeak")
  26. private static ObservableIsRequests instance;
  27. @SuppressLint("StaticFieldLeak")
  28. private static Context mContext;
  29. private static CallType callType;
  30. private static OkHttpClient okHttpClient;
  31. private String mCacheUrl = "";
  32. private OnOkHttpCallBack okHttpCallBack;
  33. public Class<T> tClass;
  34. static ObservableIsRequests getInstance(Context context, CallType type2) {
  35. if (instance == null) {
  36. synchronized (ObservableIsRequests.class) {
  37. if (instance == null) {
  38. instance = new ObservableIsRequests();
  39. OkHttpClient httpClient = new OkHttpClient();
  40. okHttpClient = httpClient.newBuilder()
  41. .addNetworkInterceptor(new CacheInterceptor())
  42. .addInterceptor(Cache.HTTP_LOGGING_INTERCEPTOR)
  43. .cache(Cache.privateCache(context))
  44. .connectTimeout(30, TimeUnit.SECONDS)
  45. .readTimeout(30, TimeUnit.SECONDS)
  46. .writeTimeout(30, TimeUnit.SECONDS)
  47. .build();
  48. }
  49. }
  50. }
  51. mContext = context;
  52. callType = type2;
  53. return instance;
  54. }
  55. void request(String url, OnOkHttpCallBack OnOkHttpCallBack) {
  56. this.okHttpCallBack = OnOkHttpCallBack;
  57. getObservable(url).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
  58. .serialize().subscribe(new Observer<T>() {
  59. @Override
  60. public void onSubscribe(Disposable d) {
  61. }
  62. @Override
  63. public void onNext(T t) {
  64. okHttpCallBack.onSuccess(t);
  65. }
  66. @Override
  67. public void onError(Throwable e) {
  68. okHttpCallBack.onFailure(e);
  69. }
  70. @Override
  71. public void onComplete() {
  72. okHttpCallBack.onCompleted();
  73. }
  74. });
  75. }
  76. private Observable<T> getObservable(final String url) {
  77. return Observable.create(new ObservableOnSubscribe<T>() {
  78. @Override
  79. public void subscribe(ObservableEmitter<T> e) {
  80. send(url, e);
  81. }
  82. });
  83. }
  84. private void send(String url, ObservableEmitter<T> subscriber) {
  85. mCacheUrl = url;
  86. InternetBean bean = Internet.ifInternet(mContext);
  87. if (bean.getStatus()) {
  88. Call call = okHttpClient.newCall(okHttpCallBack.setRequest(url));
  89. sendCall(call, subscriber);
  90. } else {
  91. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  92. if (FormatUtil.isNotEmpty(json)) {
  93. T t = new Gson().fromJson(json, tClass);
  94. subscriber.onNext(t);
  95. subscriber.onComplete();
  96. } else {
  97. subscriber.onError(new Error(bean.getMsg()));
  98. subscriber.onComplete();
  99. }
  100. }
  101. }
  102. /**
  103. * 请求
  104. */
  105. private void sendCall(Call call, ObservableEmitter<T> subscriber) {
  106. if (callType == CallType.SYNC) {
  107. sync(call, subscriber);
  108. } else if (callType == CallType.ASYNC) {
  109. async(call, subscriber);
  110. }
  111. }
  112. /**
  113. * 同步请求
  114. */
  115. private void sync(Call call, ObservableEmitter<T> subscriber) {
  116. try {
  117. Response execute = call.execute();
  118. if (execute.isSuccessful()) {
  119. String str = execute.body().string();
  120. if (OkHttpInfo.isLOG) {
  121. Log.v(OkHttpInfo.TAG, str);
  122. }
  123. if ((str.substring(0, 1).equals("<") || str.substring(0, 1).equals("["))
  124. && (str.substring(1, 2).equals("\"") || str.substring(1, 2).equals("["))) {
  125. try {
  126. str = XML.toJSONObject(str).toString();
  127. } catch (Exception e) {
  128. e.printStackTrace();
  129. }
  130. if (!str.toUpperCase().contains("<!DOCTYPE HTML>")) {
  131. if (FormatUtil.isNotEmpty(mCacheUrl)) {
  132. CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
  133. }
  134. }
  135. }
  136. T t = new Gson().fromJson(str, tClass);
  137. subscriber.onNext(t);
  138. subscriber.onComplete();
  139. } else {
  140. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  141. if (FormatUtil.isNotEmpty(json)) {
  142. T t = new Gson().fromJson(json, tClass);
  143. subscriber.onNext(t);
  144. subscriber.onComplete();
  145. } else {
  146. subscriber.onError(new Exception("请求失败"));
  147. subscriber.onComplete();
  148. }
  149. }
  150. } catch (IOException e) {
  151. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  152. if (FormatUtil.isNotEmpty(json)) {
  153. T t = new Gson().fromJson(json, tClass);
  154. subscriber.onNext(t);
  155. subscriber.onComplete();
  156. } else {
  157. subscriber.onError(e);
  158. subscriber.onComplete();
  159. }
  160. e.printStackTrace();
  161. }
  162. }
  163. /**
  164. * 异步请求
  165. */
  166. private void async(Call call, final ObservableEmitter<T> subscriber) {
  167. call.enqueue(new Callback() {
  168. @Override
  169. public void onFailure(@NonNull Call call, @NonNull IOException e) {
  170. String json = CacheUtils.getInstance(mContext).getCacheToLocalJson(mCacheUrl);
  171. if (FormatUtil.isNotEmpty(json)) {
  172. T t = new Gson().fromJson(json, tClass);
  173. subscriber.onNext(t);
  174. subscriber.onComplete();
  175. } else {
  176. subscriber.onError(e);
  177. subscriber.onComplete();
  178. }
  179. e.printStackTrace();
  180. }
  181. @Override
  182. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  183. String str = response.body().string();
  184. if (OkHttpInfo.isLOG) {
  185. Log.v(OkHttpInfo.TAG, str);
  186. }
  187. if ((str.substring(0, 1).equals("<") || str.substring(0, 1).equals("["))
  188. && (str.substring(1, 2).equals("\"") || str.substring(1, 2).equals("["))) {
  189. try {
  190. str = XML.toJSONObject(str).toString();
  191. } catch (Exception e) {
  192. e.printStackTrace();
  193. }
  194. if (!str.toUpperCase().contains("<!DOCTYPE HTML>")) {
  195. if (FormatUtil.isNotEmpty(mCacheUrl)) {
  196. CacheUtils.getInstance(mContext).setCacheToLocalJson(mCacheUrl, str);
  197. }
  198. }
  199. }
  200. T t = new Gson().fromJson(str, tClass);
  201. subscriber.onNext(t);
  202. subscriber.onComplete();
  203. }
  204. });
  205. }
  206. }