安卓实战项目-动态桌面-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我也不怎么了解,本身多研究一下哈!
最后终极版本已提交企鹅宝求给五星好评,之后的文章就是一步步拆分这个这应用,包括服务器的搭建,数据添加!谢谢支持应用连接,点击前往线程

相关文章
相关标签/搜索