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怎么怎么好,支持什么什么 可以擴展什么什么 巴拉巴拉... 真正有自己的理解的有幾個?
一群小菜比
大道至簡,如果理解深刻,用起來會非常簡單,搞出來那么復雜的東西 只說明你們理解不太深刻.