zoukankan      html  css  js  c++  java
  • RxAndroid/java小记

    Rxandroid

    作为一个在设计模式中能把MVP发挥的淋漓尽致的框架不去学习感觉真的对不起自己,然后也学点新东西吧,响应式编程,MVP观察者模式,然后使用RxAndroid使我们自己的代码更加简洁

    然后昨天看了一个文章说,接口调用频繁使用的话会使你的整个代码看起来非常难以理解,其实想想也是,一个读者看到了你的代码,然后却发现你的代码里充斥着接口回调,哎,这时候

    他就需要寻找你这个接口到底回调到了哪里(想想也是这个道理啊);

    所以Rx(Android、java)系列很好解决了这个问题,我也是昨天才意识到,因为你可以把所需要执行的任务和任务产生的回调放在同一个地方,然后这个时候,就不需要找来找去了吧

    一目了然,任务(耗时任务或者不耗时任务)执行地,任务返回值以及后续的处理都以链式的形式调用;

    MVP是啥

    即Model view Presenter,

    mvp模式可以分离显示层和逻辑层,他们之间通过接口进行通信(好像我之前很多都是用接口通信的诶!冥冥中也有用到mvp模式),降低耦合;

    从图中可以看出Presenter分别和Model和view交互,而view和Model之间并没有直接联系

    这样随着我们的业务在拓展然后UI改变的话,或者业务逻辑改变UI也有修改的话,如果不分开,那将是一件非常头疼的事,因为你都要两者兼顾,但是现在你只需要

    专心专注于UI界面或者业务逻辑的修改了!嗯 ,差不多MVP就是这个好处吧

    然后是RxAndroid

    rxandroid是rxjava的扩展,然后使用起来的话有提供很多方法给我们进行任务的操作

    如just,map,fromCallable等。然后是两个重要的类Observable(事件发布者,被观察者),Observer(观察者,事件订阅者,Subscription(事件订阅者)。

    just方法使用

    just方法适用于不耗时的任务,同步方法

    //事件发布者
        Observable<String> listObservable;
    /**just测试,这里的getString是一个简单的返回String的函数(不贴出来)*/
         listObservable = Observable.just(getString());
    
    listObservable.subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {
                    Log.v("test","OnCompleted");
                }
    
                @Override
                public void onError(Throwable e) {
                    Log.v("test","OnError"+e);
                }
    
                @Override
                public void onNext(String s) {
                    textView.setText(s);
                    Log.v("test","OnNext:------"+s);
                }
            });

    如上代码just()方法参数内可以传入一个值,值的类型由事件发布者在定义时规定,应与其保持一致。值获取成功后将通知onNext函数“发布”。

    然后我们就可以在onNext函数进行相关操作了。这是简单的使用,然而rxandroid精髓之处在于对线程的操作(虽然我会说,但是感觉还是没有完全理解)

    fromCallable()方法

    just方法只是一个基础的方法,然而在实际情况中我们会有很多耗时的操作比如,网络请求,比如数据库存储等等,这个时候我们就需要用到异步的方法

    fromcallbale用法和just类似,但是多了些控制线程的东西

    /**长时间耗时任务测试*/
            listObservable = Observable.fromCallable(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    return getStringLongTime();
                }
            });
    
    Subscription mtvSubscription = listObservable
                    .subscribeOn(Schedulers.io())  //指定Observable中的方法运行的线程
                    .observeOn(AndroidSchedulers.mainThread())//指定onNext运行线程
                    .subscribe(new Observer<String>() {
                        @Override
                        public void onCompleted() {
                            Log.v("test_CallAble","OnCompled:------");
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            Log.v("test_CallAble","OnError:------"+e);
                        }
    
                        @Override
                        public void onNext(String s) {
                            textView.setText(s);
                            Log.v("test_CallAble","OnNext:------"+s);
                        }
                    });

    被观察者new了一个Callable的实例,里面运行长时间耗时任务,完成后将异步通知观察者的OnNext方法

    subscribOn是指定Observable运行的线程

    observeOn是指定观察者OnNext方法所执行的线程

    map方法

    这里copy一下大神的代码过来,表述了map的使用方法,自行领会 debounce设置延迟时间

    mTextWatchSubscription = mSearchResultsSubject
        .debounce(400, TimeUnit.MILLISECONDS)//设置400毫秒等待时间
        .observeOn(Schedulers.io())
        .map(new Func1<String, List<String>>() {
    
            @Override 
            public List<String> call(String s) { 
                return mRestClient.searchForCity(s); 
            } 
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<List<String>>() { 
    
            @Override 
            public void onCompleted() { }
    
            @Override 
            public void onError(Throwable e) { } 
    
            @Override
            public void onNext(List<String> cities) {
                handleSearchResults(cities); 
            }
        });
    
    mSearchInput.addTextChangedListener(new TextWatcher() {
    
        @Override 
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
    
        @Override 
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //有text改变时,调用onNext方法
            mSearchResultsSubject.onNext(s.toString()); 
        }
    
        @Override 
        public void afterTextChanged(Editable s) { } 
    });

    图片引用自:Android 源码 设计模式 解析与实战 【何红辉,关爱民著】

    部分代码copy自博客园作者:还没好好感受年轻

  • 相关阅读:
    服务器建设问题
    JDBC --反射(二)
    Cookies
    http和https区别
    springboot常用注解
    线程池
    悲观锁和乐观锁
    java高并发下的数据安全
    idea解决mybatis逆向工程
    spring Cloud
  • 原文地址:https://www.cnblogs.com/fengfenghuifei/p/6186396.html
Copyright © 2011-2022 走看看