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