為什么不用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怎么怎么好,支持什么什么  可以擴展什么什么  巴拉巴拉... 真正有自己的理解的有幾個? 

一群小菜比  

大道至簡,如果理解深刻,用起來會非常簡單,搞出來那么復雜的東西  只說明你們理解不太深刻.  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM