简述app开发流程免费seo网站的工具
news/
2025/10/8 8:50:23/
文章来源:
简述app开发流程,免费seo网站的工具,做网站是干什么的,信用泰安网站此文介绍了RxJava处理业务异常的几种方式#xff0c;分享给大伙。具体如下#xff1a;关于异常Java的异常可以分为两种#xff1a;运行时异常和检查性异常。运行时异常#xff1a;RuntimeException类及其子类都被称为运行时异常#xff0c;这种异常的特点是Java编译器不去…此文介绍了RxJava处理业务异常的几种方式分享给大伙。具体如下关于异常Java的异常可以分为两种运行时异常和检查性异常。运行时异常RuntimeException类及其子类都被称为运行时异常这种异常的特点是Java编译器不去检查它也就是说当程序中可能出现这类异常时即使没有用try...catch语句捕获它也没有用throws字句声明抛出它还是会编译通过。检查性异常除了RuntimeException及其子类以外其他的Exception类及其子类都属于检查性异常。检查性异常必须被显式地捕获或者传递。当程序中可能出现检查性异常时要么使用try-catch语句进行捕获要么用throws子句抛出否则编译无法通过。处理业务异常业务异常指的是正常的业务处理时由于某些业务的特殊要求而导致处理不能继续所抛出的异常。在业务层或者业务的处理方法中抛出异常在表现层中拦截异常以友好的方式反馈给使用者以便其可以依据提示信息正确的完成任务功能的处理。1. 重试不是所有的错误都需要立马反馈给用户比如说在弱网络环境下调用某个接口出现了超时的现象也许再请求一次接口就能获得数据。那么重试就相当于多给对方一次机会。在这里我们使用retryWhen操作符它将错误传递给另一个被观察者来决定是否要重新给订阅这个被观察者。听上去有点拗口直接上代码吧。/*** 获取内容* param fragment* param param* param cacheKey* return*/public Maybe getContent(Fragment fragment, ContentParam param, String cacheKey) {if (apiService null) {apiService RetrofitManager.get().apiService();}return apiService.loadContent(param).retryWhen(new RetryWithDelay(3,1000)).compose(RxLifecycle.bind(fragment).toLifecycleTransformer()).compose(RxUtils.toCacheTransformer(cacheKey));}这个例子是一个网络请求compose的内容可以忽略。如果网络请求失败的话会调用retryWhen操作符。RetryWithDelay实现了Function接口RetryWithDelay是一个重试的机制包含了重试的次数和重试时间隔的时间。import com.safframework.log.L;import org.reactivestreams.Publisher;import java.util.concurrent.TimeUnit;import io.reactivex.Flowable;import io.reactivex.annotations.NonNull;import io.reactivex.functions.Function;/*** 重试机制* Created by tony on 2017/11/6.*/public class RetryWithDelay implements Function, Publisher {private final int maxRetries;private final int retryDelayMillis;private int retryCount;public RetryWithDelay(final int maxRetries, final int retryDelayMillis) {this.maxRetries maxRetries;this.retryDelayMillis retryDelayMillis;this.retryCount 0;}Overridepublic Publisher apply(NonNull Flowable extends Throwable attempts) throws Exception {return attempts.flatMap(new Function() {Overridepublic Publisher apply(Throwable throwable) throws Exception {if (retryCount maxRetries) {L.i(RetryWithDelay, get error, it will try after retryDelayMillis millisecond, retry count retryCount);// When this Observable calls onNext, the original// Observable will be retried (i.e. re-subscribed).return Flowable.timer(retryDelayMillis, TimeUnit.MILLISECONDS);} else {// Max retries hit. Just pass the error along.return Flowable.error(throwable);}}});}}如果运气好重试成功了那用户在无感知的情况下可以继续使用产品。如果多次重试都失败了那么必须在onError时做一些异常的处理提示用户可能是网络的原因了。2. 返回一个默认值有时出错只需返回一个默认值有点类似Java 8 Optional的orElse()RetrofitManager.get().adService().vmw(param).compose(RxLifecycle.bind(fragment).toLifecycleTransformer()).subscribeOn(Schedulers.io()).onErrorReturn(new Function() {Overridepublic VMWModel apply(Throwable throwable) throws Exception {return new VMWModel();}});上面的例子使用了onErrorReturn操作符表示当发生错误的时候发射一个默认值然后结束数据流。所以 Subscriber 看不到异常信息看到的是正常的数据流结束状态。跟它类似的还有onErrorResumeNext操作符表示当错误发生的时候使用另外一个数据流继续发射数据。在返回的被观察者中是看不到错误信息的。使用了onErrorReturn之后onError是不是就不做处理了onErrorReturn的确是返回了一个默认值如果onErrorReturn之后还有类似doOnNext的操作并且doOnNext中出错的话onError还是会起作用的。曾经遇到过一个复杂的业务场景需要多个网络请求合并结果。这时我使用zip操作符让请求并行处理等所有的请求完了之后再进行合并操作。某些请求失败的话我使用了重试机制某些请求失败的话我给了默认值。3. 使用onError处理异常现在的Android开发中网络框架是Retrofit的天下。在接口定义的返回类型中我一般喜欢用Maybe、Completable来代替Observable。我们知道RxJava在使用时观察者会调用onNext、onError、onComplete方法其中onError方法是事件在传递或者处理的过程中发生错误后会调用到。下面的代码分别封装两个基类的Observer都重写了onError方法用于处理各种网络异常。这两个基类的Observer是在使用Retrofit时使用的。封装一个BaseMaybeObserverimport android.accounts.NetworkErrorExceptionimport android.content.Contextimport com.safframework.log.Limport io.reactivex.observers.DisposableMaybeObserverimport java.net.ConnectExceptionimport java.net.SocketTimeoutExceptionimport java.net.UnknownHostException/*** Created by Tony Shen on 2017/8/8.*/abstract class BaseMaybeObserver : DisposableMaybeObserver() {internal var mAppContext: Contextinit {mAppContext AppUtils.getApplicationContext()}override fun onSuccess(data: T) {onMaybeSuccess(data)}abstract fun onMaybeSuccess(data: T)override fun onError(e: Throwable) {var message e.messageL.e(message)when(e) {is ConnectException - message mAppContext.getString(R.string.connect_exception_error)is SocketTimeoutException - message mAppContext.getString(R.string.timeout_error)is UnknownHostException - message mAppContext.getString(R.string.network_error)is NetworkErrorException - message mAppContext.getString(R.string.network_error)else - message mAppContext.getString(R.string.something_went_wrong)}RxBus.get().post(FailedEvent(message))}override fun onComplete() {}}封装一个BaseCompletableObserverimport android.accounts.NetworkErrorExceptionimport android.content.Contextimport com.safframework.log.Limport io.reactivex.observers.ResourceCompletableObserverimport java.net.ConnectExceptionimport java.net.SocketTimeoutExceptionimport java.net.UnknownHostException/*** Created by Tony Shen on 2017/8/8.*/abstract class BaseCompletableObserver : ResourceCompletableObserver() {internal var mAppContext: Contextinit {mAppContext AppUtils.getApplicationContext()}override fun onComplete() {onSuccess()}abstract fun onSuccess()override fun onError(e: Throwable) {var message e.messageL.e(message)when(e) {is ConnectException - message mAppContext.getString(R.string.connect_exception_error)is SocketTimeoutException - message mAppContext.getString(R.string.timeout_error)is UnknownHostException - message mAppContext.getString(R.string.network_error)is NetworkErrorException - message mAppContext.getString(R.string.network_error)else - message mAppContext.getString(R.string.something_went_wrong)}RxBus.get().post(FailedEvent(message))}}在这里用到了Kotlin来写这两个基类使用Kotlin的目的是因为代码更加简洁避免使用switch或者各种if(XX instancof xxException)来判断异常类型可以跟Java代码无缝结合。下面的代码展示了如何使用BaseMaybeObserver即使遇到异常BaseMaybeObserver的onError也会做相应地处理。如果有特殊的需求也可以重写onError方法。model.getContent(VideoFragment.this,param, cacheKey).compose(RxJavaUtils.maybeToMain()).doFinally(new Action() {Overridepublic void run() throws Exception {refreshlayout.finishRefresh();}}).subscribe(new BaseMaybeObserver(){Overridepublic void onMaybeSuccess(ContentModel data) {adpter.addDataToFront(data);}});4. 内部异常使用责任链模式来分发这是微信中一位网友提供的方法他做了一个很有意思的用于异常分发的一个库github地址https://github.com/vihuela/Retrofitplus内部异常使用责任链分发分发逻辑为自定义异常-网络异常-服务器异常-内部程序异常-未知异常除了以上自定义异常之外此库包含其它异常分发默认适应场景为RxJson自定义异常使用请调用ExceptionParseMgr类的addCustomerParser方法添加业务异常这个库对原先的代码无侵入性。此外他还提供了另一种思路结合compose来处理一些特定的业务异常。总结此文仅仅是总结了个人使用RxJava遇到业务异常的情况并对此做了一些相应地处理肯定是不能覆盖开发的方方面面仅作为抛砖引玉如果有更好、更优雅的处理方式一定请告知。上面即是这篇文章的内容希望对各位的学习有所启发也希望大家多多支持学猫在线(shtml.net)。本文来源http://www.jianshu.com/p/423cc558556b
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931277.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!