From 5ca8b01844798011e887e02b6934d6f125b56db1 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Tue, 24 Jun 2025 16:49:19 +0000
Subject: [PATCH] 完善网络请求
---
libmvi/src/main/java/com/runt/open/mvi/base/model/BaseViewModel.kt | 30 +++++++---
libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpErrorObserver.java | 61 ++++++++++++++++++++
libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpObserver.java | 30 +++++-----
3 files changed, 97 insertions(+), 24 deletions(-)
diff --git a/libmvi/src/main/java/com/runt/open/mvi/base/model/BaseViewModel.kt b/libmvi/src/main/java/com/runt/open/mvi/base/model/BaseViewModel.kt
index 12fedd1..5e10ab6 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/base/model/BaseViewModel.kt
+++ b/libmvi/src/main/java/com/runt/open/mvi/base/model/BaseViewModel.kt
@@ -5,9 +5,9 @@
import android.os.Build
import android.provider.MediaStore
import android.util.Log
-import androidx.activity.ComponentActivity
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModel
+import com.google.gson.Gson
import com.runt.open.mvi.base.BaseActivity
import com.runt.open.mvi.base.LayoutView
import com.runt.open.mvi.data.LoadingState
@@ -20,8 +20,11 @@
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import okhttp3.Callback
+import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
+import okhttp3.RequestBody
+import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import java.io.File
import java.io.FileInputStream
@@ -57,7 +60,7 @@
TAG = javaClass.simpleName;
}
- fun getActivity(): ComponentActivity {
+ fun getActivity(): BaseActivity<LayoutView<BaseViewModel> , BaseViewModel> {
return mActivity!!;
}
@@ -69,13 +72,15 @@
_isLoading.value = _isLoading.value.copy(isVisible = false);
}
- fun showDialog( title:String = "", message: String = "", confirmText:String = "确定", cancelText:String = "",
- touchOutside:Boolean = true,//空白和系统返回 是否关闭
- showClose:Boolean = false,//显示关闭图标(默认不显示)
- confirmDissmiss:Boolean = true,//点击确定是否关闭
- cancelDissmiss:Boolean = true,//点击取消是否关闭
- onDismissRequest : () -> Unit = {},
- onConfirmRequest : () -> Unit = {}, ){
+ fun showDialog(
+ title : String = "" , message : String = "" , confirmText : String = "确定" , cancelText : String = "" ,
+ touchOutside : Boolean = true , //空白和系统返回 是否关闭
+ showClose : Boolean = false , //显示关闭图标(默认不显示)
+ confirmDissmiss : Boolean = true , //点击确定是否关闭
+ cancelDissmiss : Boolean = true , //点击取消是否关闭
+ onDismissRequest : () -> Unit = {} ,
+ onConfirmRequest : () -> Unit = {} ,
+ ){
_messageState.value = MessageState(title = title, message = message, touchOutside = touchOutside, showClose = showClose, confirmText = confirmText,
cancelText = cancelText, confirmDissmiss = confirmDissmiss, cancelDissmiss = cancelDissmiss, onDismissRequest = onDismissRequest,
@@ -250,6 +255,13 @@
}.subscribe(observer)
}
+ fun createJsonBody(obj : Any) : RequestBody {
+ val mediaType = "application/json; charset=utf-8".toMediaType()
+ val json = if (obj is String) obj else Gson().toJson(obj)
+ val requestBody = json.toString().toRequestBody(mediaType)
+ return requestBody;
+ }
+
fun getFilePathFromUri(uri:Uri):String?{
var filePath = "";
var filePathColumn = arrayOf(MediaStore.Video.Media.DATA)
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpErrorObserver.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpErrorObserver.java
new file mode 100644
index 0000000..1637894
--- /dev/null
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpErrorObserver.java
@@ -0,0 +1,61 @@
+package com.runt.open.mvi.retrofit.observable;
+
+
+import com.runt.open.mvi.base.model.BaseViewModel;
+import com.runt.open.mvi.data.HttpApiResult;
+
+import java.util.Date;
+
+import io.reactivex.Observable;
+
+/**
+ * 请求超时处理
+ * @author Runt (qingingrunt2010@qq.com)
+ * @purpose
+ * @date 2023/3/21
+ */
+public abstract class HttpErrorObserver<RESULT> extends HttpObserver<RESULT>{
+
+ protected long requestErrorTimes = new Date().getTime();
+ protected final long OVERTIME = 50000;//超时时长50s
+ protected Observable observable;//接口请求服务
+ protected BaseViewModel viewModel;
+
+ public HttpErrorObserver(Observable observable, BaseViewModel viewModel) {
+ this.observable = observable;
+ this.viewModel = viewModel;
+ }
+
+ public HttpErrorObserver(BaseViewModel viewModel) {
+ this(null,viewModel);
+ }
+
+ public void setObservable(Observable observable) {
+ this.observable = observable;
+ }
+
+ @Override
+ public void onFailed(HttpApiResult<RESULT> httpResult) {
+ if(httpResult.code >= 604 && httpResult.code < 608 && new Date().getTime() - requestErrorTimes < OVERTIME){
+ try {
+ viewModel.httpObserverOn(observable,this);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }else if(httpResult.code >= 604 && httpResult.code < 608 ){
+ onTimeOut();
+ }else{
+ onEndFailed(httpResult);
+ }
+ }
+
+ /**
+ * 请求错误
+ */
+ public abstract void onEndFailed(HttpApiResult<RESULT> httpResult);
+
+ /**
+ * 请求超时
+ */
+ public abstract void onTimeOut();
+}
\ No newline at end of file
diff --git a/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpObserver.java b/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpObserver.java
index 659c3cf..7695b29 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpObserver.java
+++ b/libmvi/src/main/java/com/runt/open/mvi/retrofit/observable/HttpObserver.java
@@ -3,7 +3,6 @@
import android.util.Log;
import com.google.gson.Gson;
-import com.runt.open.mvi.base.BaseActivity;
import com.runt.open.mvi.data.HttpApiResult;
import java.net.ConnectException;
@@ -22,27 +21,24 @@
*/
public abstract class HttpObserver<RESULT> implements Observer<HttpApiResult<RESULT>> {
- BaseActivity activity;
-
public HttpObserver() {
}
- public HttpObserver(BaseActivity activity) {
- this.activity = activity;
- }
-
final String TAG = "HttpObserver";
+ protected int observerStatus;//0 订阅 1 响应 2 请求错误 3 结束
@Override
public void onSubscribe(Disposable d) {
+ observerStatus = 0 ;
Log.d(TAG,"onSubscribe "+hashCode());
}
@Override
public void onNext(HttpApiResult<RESULT> httpResult) {
+ observerStatus = 1;
Log.d(TAG,"onNext "+httpResult);
if (httpResult != null && httpResult.code == 0) {
- onSuccess(httpResult.data);
+ handleResult(httpResult.data);
}else{
onFailed(httpResult);//接口返回错误
}
@@ -50,6 +46,7 @@
@Override
public void onError(Throwable e) {
+ observerStatus = 2;
Log.e(TAG,"onError "+e.getMessage()+" "+hashCode());
int code = 600;
String msg = "网络请求失败,请检查网络或稍后重试";
@@ -70,16 +67,19 @@
@Override
public void onComplete() {
+ observerStatus = 3;
Log.i(TAG,"onComplete "+hashCode());
}
- protected abstract void onSuccess(RESULT data);
+ /**
+ * 处理返回数据
+ * @param result
+ */
+ public abstract void handleResult(RESULT result);
- protected void onFailed(HttpApiResult error){
- Log.i(TAG,"onFailed "+activity);
- if(activity != null){
- activity.showToast(error.msg);
- }
- }
+ /**
+ * 请求错误信息
+ */
+ public abstract void onFailed(HttpApiResult<RESULT> result);
}
--
Gitblit v1.9.1