luqinmao / TomatoIt

okgo+rxjava+mvp实现玩Android客户端
228 stars 42 forks source link

关于rxjava的subscribe(new Observer())结构 #2

Open magic0908 opened 6 years ago

magic0908 commented 6 years ago

我觉得可以写一个抽象类实现Observer接口,构造方法传一个context进去,然后重写onError方法,将一些错误统一由父类处理(包括JsonConvert抛出的异常),子类只需要实现onNext方法。 我也是okgo的使用者,看着楼主的代码觉得很清晰,不过我目前使用的还是MVC,一直想把项目改成MVP模式,但是因为自己目前对MVP的理解还不够透彻,所以我觉得这个项目可以学习很多。

luqinmao commented 6 years ago

是的,没必要每次new Oberver实现四个回调方法,还有子类继承BaseActivity中,像一些很简单的界面,就没必要创建presenter了。哈哈,谢谢。

luqinmao commented 6 years ago

@magic0908 关于你说的Observer封装已经弄好了,放在rxjavahelper文件夹下,封装了三个类,让代更简洁合理,你可以看一下

magic0908 commented 6 years ago

我刚刚看了,封装了之后感觉代码少多了。不过我这里的是把onError也在rxobserver里默认处理了,但是要在构造方法传一个context,因为我们这边有个需求,当用户信息过期了,需要弹对话框重新登录。 还有一点就是,是不是每个rx订阅是不是都得重写OnSubscribe方法把disposable添加进去?如果是的话,我觉得这个也可以再封装一下。

luqinmao commented 6 years ago

@magic0908 关于用户信息过期,可以在RxResultHelper中判断如果是token过期的话,先作为error处理,然后在RxObserver 的onError()中处理,通过回调或者接口,将该事件传递出去

magic0908 commented 6 years ago

不是很明白,比如我这里是code为301表示登录失效,那么我直接把301传进error里,怎么通过回调传出去

luqinmao commented 6 years ago

@magic0908 class RxObserver{ void onError{ if(error == 登录过期 ){ expireToken(); }else{ public abstract void _onError(String errorMessage); }
} public void expireToken(); public abstract void _onError(String errorMessage); }

然后在需要token过期的界面弹dialog处理,这样可以吧?我没实际用过,你试一下。

magic0908 commented 6 years ago

你的意思是指,在订阅的时候重写expireToken()方法,在里面处理弹框逻辑吗。那岂不是每个订阅事件都需要重写此方法

luqinmao commented 6 years ago

@magic0908 上面的解决方法是可以的,甚至发个广播都行,我有参考别人用了拦截器,你看一下

magic0908 commented 6 years ago

你前面说的我都有考虑过,如果是发广播,假如A页面涉及到网络请求,然后A进入B,当前的B进行请求,接口返回登录失效,在A和B都能收到广播,那会在两个页面都有弹窗。 我觉得主要的问题是,弹窗需要一个activity的context,所以我目前的处理方法是在RxObserver的构造函数里传个context,然后错误逻辑都在RxObserver处理,外部只需要重写个onNext方法就行。却始终没找到更好的方法。

luqinmao commented 6 years ago

@magic0908 用全局dialog不会有这问题吧

magic0908 commented 6 years ago

全局的dialog是指用WindowManager来创建的吗?但是这个需要申请悬浮窗权限