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