为什么不用rxjava?
rxjava等系列产品.思想是很好的,但是被大多数人用成了一坨屎!
就拿rx最经典的那个例子来说:
假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在imageCollectorView 中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。常用的实现方式有多种,我这里贴出其中一种:
new Thread() {
@Override
public void run() {
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();
猛一看有点繁琐,应该可以优化下,别急先看看rx怎么实现.
rxjava :
Observable.from(folders)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});
猛一看mdzz(玛德制杖),仔细一看mdzzz(玛德真制杖)----> 代码写成这样不脑残么?知不知道什么叫做解耦合啊?
我的实现:
//----------开始加载所有图片
public void addAllImg(){
x.task().run(new Runnable() {//我用xutils3异步任务
@Override
public void run() {
for (File folder : folders) { //遍历文件夹
File[] files = folder.listFiles();
for (File file : files) { //遍历文件
addAllImg_1(file); //调用后续方法处理
}
}
}
});
} private void addAllImg_1(File file){ //处理,更新ui等
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
//----------加载所有图片完毕
rx系列缺点太多了,任意一条都够理由不用他了 因为有更好的实现呀
1.过度使用设计模式,逻辑是只有一条但是代码被你们写成了屎呀 还链式也是醉人
什么叫链式,看我的实现... 支持继续扩展 2 3 4 5 6 ... n
private void addAllImg_2()
private void addAllImg_3()
...
2.好的思想不懂合理利用,看看Android-LessCallBack是怎么用的
//按id顺序执行的
public class Test2 {
@TaskFlow(thread = true, id = 0)
public void doTask1() {
System.out.println(Thread.currentThread().getName()+":"+"任务1");
waitTime();
}
@TaskFlow(thread = false, id = 1)
public void doTask1Finish() {
System.out.println(Thread.currentThread().getName()+":"+"任务1执行结束");
}
@TaskFlow(thread = true, id = 2)
public void doTask2() {
System.out.println(Thread.currentThread().getName()+":"+"任务2");
waitTime();
}
@TaskFlow(thread = false, id = 3)
public void doTask2Finish() {
System.out.println(Thread.currentThread().getName()+":"+"任务2执行结束");
}
public static void main(String[] args) {
TaskFlowUtils.inject(new Test2()).run();;
}
public static void waitTime(){
int x = new Random().nextInt(1000) + 500;
try {
System.out.println("等待"+x+"毫秒");
Thread.sleep(x);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
线程:任务1
等待515毫秒
ui线程:任务1执行结束
线程:任务2
等待655毫秒
ui线程:任务2执行结束
在我看来其与rx类似,都用到next这一思想,不同的是:
lesscallback 实现复杂,调用简单
rx实现复杂,调用也特么复杂
3.耦合度太大导致调试困难的问题...满眼的next subscribe observe
有写问题写时候,你可能没发现 维护时候你就懂了
4.学习难度大,想要吃个牛肉串你让我先学宰牛?
5.少用interface 如果可以,尽量不要用 (interface是一种挖洞行为,除非不可避免否则不要挖洞)
对于你们那些 网络请求还先写个interface的我表示无法理解 每个页面都有自己的功能,在各自的页面(函数里)实现自己的功能 更是一种分布式的思想
随便搜一下都是rx怎么怎么好,支持什么什么 可以扩展什么什么 巴拉巴拉... 真正有自己的理解的有几个?
一群小菜比
大道至简,如果理解深刻,用起来会非常简单,搞出来那么复杂的东西 只说明你们理解不太深刻.
为什么不用rxjava?的更多相关文章
- Retrofit结合RxJava使用指南
Retrofit结合RxJava使用指南 Retrofit是一个当前很流行的网络请求库, 官网的介绍是: "Type-safe HTTP client for Android and Jav ...
- 78. Android之 RxJava 详解
转载:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Fli ...
- RxJava学习入门
RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...
- RxJava 与 Retrofit 结合的最佳实践
转自:http://gank.io/post/56e80c2c677659311bed9841?from=timeline&isappinstalled=0&nsukey=g1D1Y6 ...
- android ------- 开发者的 RxJava 详解
在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...
- 函数响应式编程RxJava
RxJava 到底是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event- ...
- 转:给 Android 开发者的 RxJava 详解
转自: http://gank.io/post/560e15be2dca930e00da1083 评注:多图解析,但是我还是未看懂. 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入 ...
随机推荐
- IO流总结
IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类: 按照操作数据的类型分为两种: 字节流和字符流. 按 ...
- 完全删除TFS2013上的项目
必备条件:您必须是 Team Foundation Server Administrators 组的成员或待删除项目的 Project Administrators 组的成员. 解决方法:打开&quo ...
- SQL Server 2016 JSON原生支持实例说明
背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...
- Double Dispatch讲解与实例-面试题
引言 说实话,我看过GoF<Design Patterns>,也曾深深的被李建忠<设计模式>系列Webcast吸引.但是还没有见过“Double Dispatch模式”.的确G ...
- 如何利用报表工具FineReport实现报表列的动态展示
相信动态列的实现困扰了很多人,大数据量,多字段的加载将会非常耗时,数据又做不到真正的动态灵活.现有的方式都是通过变向的隐藏等方式来实现. 那该如何解决呢?这里分享帆软报表设计器FineReport的实 ...
- 在Azure上部署Windows Server Core
作为服务器操作系统,图形界面真心有些多余了,这也是很多人喜欢Linux服务器的原因之一.从Windows Server 2008开始,微软提供了Server Core版本,其实就是一个没有图形界面的服 ...
- 项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程
之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- 详解用CSS3制作圆形滚动进度条动画效果
主 题 今天手把手教大家用CSS3制作圆形滚动进度条动画,想不会都难!那么,到底是什么东东呢?先不急,之前我分享了一个css实现进度条效果的博客<CSS实现进度条和订单进度条>,但是呢, ...
- UVA10304
全部遍历.设置两个下标,若相同i++,j++,不相同则j++. #include<stdio.h> #include<string.h> int main(){ ]; ]; s ...