安卓實戰項目-動態桌面-rxjava實現搜索本地全部視頻

前言:上一篇文章已經實現了將assets文件中設置成動態壁紙:安卓實戰項目-動態桌面-簡單實現java


需求:既然assets文件能用於動態桌面,那麼手機中的視頻也能夠吧,有沒有大膽的想法?react


上效果圖:android

效果圖


分析:
1,相似於上面圖片的搜索效果,經過點擊button,搜索出咱們須要的文件(圖片中用list演示),此時用到了遞歸遍歷搜索全部文件夾,終止條件就是文件。
2,對於輸入框中的內容進行處理,分析輸入框內容,根據內容匹配相應的文件,並展現出來;segmentfault


RxJava:原理是觀察者模式,舉個例子,兩我的a,b;a是城牆烽火臺守衛,b是城池內護衛;a守衛的職責即是觀望敵軍有沒有進犯,若是發現了,就放烽火,而後b護衛就能知道有敵軍,而後調兵支援;在咱們的搜索視頻中也是這樣,一個線程不停的搜索文件,當看到.mp4視頻文件時,就發送信號,咱們的list收到信號之後,就會調用list.add()添加這個視頻;最後搜索完全部文件夾,線程就發信號我搜索完了,而後咱們的界面的recyclerview就能夠填充list中的數據啦。純屬我的理解的rxjava,有啥不對,歡迎指正哈(溫柔點)!服務器


上代碼:app

//添加依賴,兩個,一個rxjava,一個rxandroid
    compile 'io.reactivex.rxjava2:rxjava:2.1.0'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    //這個就不解釋了,之前的listview升級版
    compile 'com.android.support:recyclerview-v7:25.3.1'

java代碼:
搜索文件:這裏的返回結果是:存在的,可讀的,不大不小的視頻文件ide

public Observable<File> searchVideoFiles(File file) {

        //遍歷遞歸文件夾
        if(file.isDirectory()){
            return Observable.fromArray(file.listFiles()).flatMap(new         Function<File, ObservableSource<File>>() {
                @Override
                public ObservableSource<File> apply(@NonNull File file) throws Exception {
                    return searchVideoFiles(file);
                }

            });
        }else{
        //當是文件的時候就開始判斷這個文件是否是存在,是否是視頻文件,是否是可讀,還有的話過小的太大咱們都不要,規則tools類本身定義,全是boolean類型的別搞錯了
            return Observable.just(file).filter(new Predicate<File>() {
                @Override
                public boolean test(@NonNull File file) throws Exception {
                    //獲取文件的類型
                    String mimeType = Tools.getMimeType(file.getName());
                    return file.exists()&&file.canRead()&&Tools.isVideo(mimeType)&&Tools.passSmallAndBigFile(file.length());
                }
            });
        }
    }

//rootFile 指的是根目錄,也就是咱們要遍歷的文件夾
Observable.just(rootFile)
                .flatMap(new Function<File, ObservableSource<File>>() {
                    @Override
                    public ObservableSource<File> apply(@NonNull File file) throws Exception {
                         //調用上面的方法,返回咱們須要的視頻文件
                        return searchVideoFiles(file);
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<File>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        System.out.println("onSubscribe");
                    }

                    @Override
                    public void onNext(@NonNull File file) {
                        String name = file.getName();
                        String absolutePath = file.getAbsolutePath();
                        String fileSize = Tools.getFileSize(file.length());
                        VideoBean bean = new VideoBean(name, absolutePath, fileSize);
                        //上面找到一個咱們須要的視頻,就會調用onNext,到這裏,video是arraylist
                        videos.add(bean);
                        //找到一個,recyclerview就展現一個
                        view.showResult(videos);

                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        System.out.println("onError");
                        
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("onComplete");
                       //當搜索完之後,咱們的界面還能夠Toast一下,告訴用戶咱們搜索完畢,增長用戶體驗
                    }
                });

整體思路:搜索出須要的視頻文件,傳到list中,view展現出來!spa


好了代碼就不上了,根據上面思路多練練,rxjava我也不怎麼了解,本身多研究一下哈!
最後終極版本已提交企鵝寶求給五星好評,之後的文章就是一步步拆分這個這應用,包括服務器的搭建,數據添加!謝謝支持應用連接,點擊前往線程

相關文章
相關標籤/搜索