当前位置: 首页 > news >正文

为什么网站浏览不是做的那样/电商培训机构有哪些?哪家比较好

为什么网站浏览不是做的那样,电商培训机构有哪些?哪家比较好,请人做网站需要注意什么,上海网站建设外包公司RxAndroid学习笔记和总结 ###前言 rx系列貌似在前一阶段火起来的,也是自己接触的少,一直没有去学习,今天就趁着周六,脑补一下。 ###什么是Rx Rx是响应式编程的意思,本质上就是观察者设计模式,是以观察者&am…

RxAndroid学习笔记和总结

###前言 rx系列貌似在前一阶段火起来的,也是自己接触的少,一直没有去学习,今天就趁着周六,脑补一下。 ###什么是Rx

  • Rx是响应式编程的意思,本质上就是观察者设计模式,是以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式
  • 在Android编程的时候,经常使用后台线程,那么就可以使用这种方式,能够使得逻辑比较清晰明了(有的人说会增加好多的代码,但是我觉得代码的链式结构让代码看起来更加简洁明了) ###Rx模式以及有点 ####优势一
  • 创建:Rx可以方便的创建事件流和数据流
  • 组合:Rx使用查询式的操作符合组合和变换数据流
  • 监听:Rx可以订阅任何可观察的数据量并执行操作 ####优势二(简化代码)
  • 函数式风格:对可观察数据流使用无副作用的输入流输出函数,避免了程序里面的错综复杂的状态
  • 简化代码:Rx的操作符通常可以将复杂的难题简化成很少的几行代码(配合lambda表达式还能简化)
  • 异步错误处理:Rx提供了何时的错误处理机制
  • 轻松使用并发:Rx的Observables和Schedulers让开发着可以很方便的切换UI线程和子线程,摆脱底层的线程同步和各种并发问题 ###响应式编程 #####Rx提供了一系列的操作符,你可以使用它们来过滤(filter)、选择(select)、变换(transform)、结合(combine)和组合(compose)多个Observable,这些操作符让执行和符合变得非常高效。 #####你可以把Observable当做Iterable的推送方式的等价物,使用Iterable,消费者从生产者那拉取数据,线程阻塞直至数据准备好,使用Observable,在数据准备好的时候,生产者将数据推送给消费者,数据可以同步或者异步的到达,方式更加灵活。 ###RxJava观察者模式
  • 需求:A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。
  • RxJava四个基本概念
    • Observable(被观察者)
    • Observer(观察者)
    • subscribe(订阅)
    • 事件
  • Observable和Observer通过subscribe()方法实现订阅的关系,从而Observable可以在需要的时候发出事件来通知Observer。

关于理论的知识,网上的介绍的太多了,大家可以去看下,在文章的结尾,我也会附几篇好的文章。 ###手动实现观察者模式 ####首先我们需要有观察者和被观察者。 #####被观察者接口(里面简单的定义添加观察者,移除观察者,通知观察者三个方法)

public interface Watched {//添加观察者public void addWatcher(Watcher watcher);//移除观察者public void removeWatcher(Watcher watcher);//通知观察者public void notifyWathers(String str);
}
复制代码

#####观察者接口(定义更新的方法)

public interface Watcher {//数据变化进行更新public void update(String str);
}复制代码

#####被观察者实现类


public class ConcreteWathed implements Watched {//观察者List<Watcher> mList = new ArrayList<>();@Overridepublic void addWatcher(Watcher watcher) {mList.add(watcher);}@Overridepublic void removeWatcher(Watcher watcher) {mList.remove(watcher);}@Overridepublic void notifyWathers(String str) {for (Watcher w : mList) {w.update(str);}}
}
复制代码

#####观察者实现类

public class ConcreteWather implements Watcher {@Overridepublic void update(String str) {System.out.println(str);}
}
复制代码

#####测试类

 public static void main(String[] args){Watched watched = new ConcreteWathed();Watcher watcher1 = new ConcreteWather();Watcher watcher2 = new ConcreteWather();Watcher watcher3 = new ConcreteWather();watched.addWatcher(watcher1);watched.addWatcher(watcher2);watched.addWatcher(watcher3);watched.notifyWathers("I go");}
复制代码

#####输出结果

I go
I go
I go复制代码

当然了,这只是简单的实现,只要晓得原理就行,除了自己实现,官方也给我们提供了观察者与被观察者接口。只要我们去实现接口就可以了。 ###利用系统提供的类和接口实现观察者模式 ####被观察者

public class XTObservable extends Observable {private int data = 0;public int getData(){return data;}public void setData(int i){if (this.data != i){this.data = i;setChanged();//发生改变notifyObservers();//通知观察者}}
}复制代码

####观察者


public class XTobserver implements Observer {public XTobserver(XTObservable observable) {observable.addObserver(this);}@Overridepublic void update(Observable observable, Object o) {System.out.println("data is changed" + ((XTObservable) observable).getData());}
}
复制代码

####测试类

public class Test {public static void main(String[] args) {XTObservable mObservable = new XTObservable();XTobserver mXTobserver = new XTobserver(mObservable);mObservable.setData(1);mObservable.setData(2);mObservable.setData(3);}
}复制代码

####输出结果

data is changed1
data is changed2
data is changed3
复制代码

上面已经手动实现观察者模式和通过系统提供类实现,当然这都不是重点,重点是Rx响应式编程 ###RxAndroid使用 ####一:使用前配置 在项目工程的build.gradle文件添加这样的一句话(如果使用lambda)

 classpath 'me.tatarka:gradle-retrolambda:2.5.0'(这一句在gradle版本下面紧接着)
复制代码

在该module工程的build.gradle文件中添加

apply plugin: 'me.tatarka.retrolambda'(使用lambda)在文件的第二行
复制代码

在buildTypes节点的下(不是节点内)添加下面一句

 compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
复制代码

然后在依赖中添加下面几句(没有提示一定添加的可以根据自己选择性添加)

//rx一定添加compile 'io.reactivex:rxjava:1.1.0'compile 'io.reactivex:rxandroid:1.1.0'compile 'com.google.code.gson:gson:2.4'compile 'com.jakewharton:butterknife:7.0.1'compile 'com.squareup.picasso:picasso:2.5.2'//添加compile 'com.squareup.okhttp3:okhttp:3.+'
复制代码

至此,使用环境已经配置好了,接下来我们来简单的使用一下。 ####利用create创建来使用Rx

/*** 使用create方式*/public static void createObserable() {//定义被观察者Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {@Overridepublic void call(Subscriber<? super String> subscriber) {if (!subscriber.isUnsubscribed()) { //观察者和被观察者还有订阅消息subscriber.onNext("hello"); //返回的数据subscriber.onNext("hi");subscriber.onNext(getUserName());  //因为是传入的是字符串泛型subscriber.onCompleted(); //完成}}});//定义观察者Subscriber showSub = new Subscriber() {@Overridepublic void onCompleted() {Log.i(TAG, "onCompleted");   //用于对话框消失}@Overridepublic void onError(Throwable e) {Log.i(TAG, e.getMessage());   //错误处理}@Overridepublic void onNext(Object o) {Log.i(TAG, o.toString());}};observable.subscribe(showSub); //两者产生订阅}/*** 可以用来写成我们的下载返回数据** @return*/public static String getUserName() {return "jsonName";}
复制代码

在主activity中调用,我们来看下控制台输出的结果:

####也是一个测试,打印

  /*** 打印的功能  链式结构,更加易于代码的可毒性*/public static void createPrint() {Observable.create(new Observable.OnSubscribe<Integer>() {@Overridepublic void call(Subscriber<? super Integer> subscriber) {if (!subscriber.isUnsubscribed()) {for (int i = 0; i < 10; i++) {subscriber.onNext(i);}subscriber.onCompleted();}}}).subscribe(new Subscriber<Integer>() {@Overridepublic void onCompleted() {Log.i(TAG, "onCompleted");}@Overridepublic void onError(Throwable e) {Log.i(TAG, e.getMessage());}@Overridepublic void onNext(Integer integer) {Log.i(TAG, "result--->:" + integer);}});}复制代码

看下控制台结果

####from函数

 /*** 使用在被观察者,返回的对象一般都是数据类型* 它接收一个集合作为输入,然后每次输出一个元素给subscriber*/public static void from() {Integer[] items = {1, 2, 3, 4, 5, 6, 7, 8};Observable onservable = Observable.from(items);onservable.subscribe(new Action1() {@Overridepublic void call(Object o) {Log.i(TAG, o.toString());}});}
复制代码

控制台结果

####interval函数

/*** 指定某一时刻进行数据发送* interval()函数的两个参数:一个指定两次发射的时间间隔,另一个是用到的时间单位*/public static void interval() {Integer[] items = {1, 2, 3, 4};Observable observable = Observable.interval(1, 1, TimeUnit.SECONDS);observable.subscribe(new Action1() {@Overridepublic void call(Object o) {Log.i(TAG, o.toString());}});}
复制代码

####just函数

  /*** 假如我们只有3个独立的AppInfo对象并且我们想把他们转化为Observable并填充到RecyclerView的item中:* 这里我们有两个数组,然后通过转化为Observable组成一个item*/public static void just() {Integer[] items1 = {1, 2, 3, 4};Integer[] items2 = {2, 4, 6, 8};Observable observable = Observable.just(items1, items2);observable.subscribe(new Subscriber<Integer[]>() {@Overridepublic void onCompleted() {Log.i(TAG, "onCompleted");}@Overridepublic void onError(Throwable e) {Log.i(TAG, e.getMessage());}@Overridepublic void onNext(Integer[] integers) {for (int i = 0; i < integers.length; i++) {Log.i(TAG, "result--->" + i);}}});}
复制代码

输出结果:

####range函数

  /*** 指定输出数据的范围*/public static void range() {Observable observable = Observable.range(1, 4);observable.subscribe(new Subscriber<Integer>() {@Overridepublic void onCompleted() {Log.i(TAG, "onCompleted");}@Overridepublic void onError(Throwable e) {Log.i(TAG, e.getMessage());}@Overridepublic void onNext(Integer o) {Log.i(TAG, "next---->" + o);}});}
复制代码

输出结果:

####filter函数

 /*** 使用过滤功能  发送消息的时候,先过滤在发送*/public static void filter() {Observable observable = Observable.just(1, 2, 3, 4, 5, 6);observable.filter(new Func1<Integer, Boolean>() {@Overridepublic Boolean call(Integer o) {return o < 5;}}).observeOn(Schedulers.io()).subscribe(new Subscriber() {@Overridepublic void onCompleted() {Log.i(TAG, "onCompleted");}@Overridepublic void onError(Throwable e) {Log.i(TAG, e.getMessage());}@Overridepublic void onNext(Object o) {Log.i(TAG, o.toString());}});}复制代码

输出结果:

好了,几个常用到的函数已经介绍完了,接下来就用几个例子来说验证一下吧。 ###使用Rx+OkHttp下载图片 #####Rx下载的封装

 /*** 声明一个被观察者对象,作为结果返回*/public Observable<byte[]> downLoadImage(String path) {return Observable.create(new Observable.OnSubscribe<byte[]>() {@Overridepublic void call(Subscriber<? super byte[]> subscriber) {if (!subscriber.isUnsubscribed()) {  //存在订阅关系//访问网络操作//请求体Request request = new Request.Builder().url(path).get().build();//异步回调mOkHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {subscriber.onError(e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {byte[] bytes = response.body().bytes();if (bytes != null) {subscriber.onNext(bytes);  //返回结果}}subscriber.onCompleted();  //访问完成}});}}});}
复制代码

#####在使用的时候调用

   //使用HTTP协议获取数据mUtils.downLoadImageOne(url).subscribeOn(Schedulers.io())  //在子线程请求.observeOn(AndroidSchedulers.mainThread()) //结果返回到主线程这一步很厉害啊,不用我们去用handler或者async切换线程了// 主要我们去调用一下代码,就已经帮我们切换好了线程,是不是感觉有点很厉害啊.subscribe(new Subscriber<byte[]>() {@Overridepublic void onCompleted() {Log.i(TAG,"onCompleted");//对话框消失}@Overridepublic void onError(Throwable e) {Log.i(TAG,e.getMessage());}@Overridepublic void onNext(byte[] bytes) {Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);mImageView.setImageBitmap(bitmap);}});
复制代码

###Rx+okhttp实现登录

  /*** * @param url  登录地址* @param params  请求参数* @return   后台返回的数据*/public Observable<String> login(String url, Map<String, String> params) {return Observable.create((Observable.OnSubscribe<String>) subscriber -> {if (!subscriber.isUnsubscribed()) {//创建formbodyFormBody.Builder builder = new FormBody.Builder();if (params != null && !params.isEmpty()) {//循环获取body中的数据for (Map.Entry<String, String> entry : params.entrySet()) {builder.add(entry.getKey(), entry.getValue());}}//请求体RequestBody requestBody = builder.build();Request request = new Request.Builder().url(url).post(requestBody).build();mOkHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {subscriber.onError(e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {//交给观察者处理数据subscriber.onNext(response.body().string());}//完成的回调subscriber.onCompleted();}});}});}
复制代码

#####登录调用

  Map<String, String> params = new HashMap<String, String>();params.put("username", userName.getText().toString().trim());params.put("password", passWord.getText().toString().trim());mUtils.login(url, params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {@Overridepublic void onCompleted() {Log.i(TAG, "onCompleted");}@Overridepublic void onError(Throwable e) {Log.i(TAG, e.getMessage());}@Overridepublic void onNext(String s) {if (JsonUtils.parse(s)) {Intent intent = new Intent(LoginActivity.this, ContentActivity.class);startActivity(intent);}}});
复制代码

如果有想需要代码的,可以看这里,所有代码已经传至github。https://github.com/wuyinlei/RxAndroidDemo 好了,就先介绍到这里吧,这里在给大家推荐几篇比较好的博文还有。 ###推荐博文

  • http://www.devtf.cn/?p=1225
  • http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html
  • http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1012/3572.html#toc_1
  • http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0430/2815.html ###推荐git
  • https://github.com/wuyinlei/RxDemo
  • https://github.com/wuyinlei/ApplicaptionMarket
  • https://github.com/androidmalin/RengwuxianRxjava
  • https://github.com/rengwuxian/RxJavaSamples
  • https://github.com/tough1985/RxjavaRetrofitDemo

###结语 Rx使用还是挺方便的,不过需要一定的学习成本,谨慎使用(嘿嘿)

http://www.lbrq.cn/news/1755955.html

相关文章:

  • 私彩网站是怎么建设的/上海快速排名优化
  • 怎么促成客户做网站/软件制作
  • 哪些网站做的比较好/北京网站建设
  • 网站建设做网站需要多少钱/广州企业推广
  • 杭州 网站建设 哪家强/seo和sem是什么意思啊
  • 网站横幅怎做/软文推广网站
  • 龙岗建设网站/济南网络优化厂家
  • 音视频娱乐网站开发商/好用的搜索引擎有哪些
  • 广州网站推广电话/谷歌浏览器下载官网
  • yw12777域名查询/seo教程seo优化
  • 关于公示网站建设的计划书/泰安做网站公司哪家比较好
  • 网站建设服务 杭州/建网站建设
  • 乌鲁木齐做企业网站/免费网站开发平台
  • 个人网页设计与实现ppt/互联网广告优化
  • 制作网站需要什么软件/seo外链建设的方法
  • 中卫市住房建设局网站/3seo
  • 天津平台网站建设报价/手机网站智能建站
  • 网站建设术语解释/今日油价最新
  • 做微网站需要域名吗/网络营销工具介绍
  • 58重庆网站建设/免费b2b平台推广
  • 汕头做网站优化哪家好/竞价排名的优缺点
  • 太原网站建设联系方式/郑州网站seo顾问
  • 信用湘潭网站/百度知道登录
  • 东莞市企业网站建设哪家好/seo网络推广哪家专业
  • 网站建设整改实施方案/今日头条新闻消息
  • 设计网站banner图片/各大网站收录查询
  • 注册表怎么做动态网站/品牌软文案例
  • 用python网站开发/知乎关键词搜索排名
  • 信阳做网站公司汉狮价格/百度竞价排名是什么方式
  • 网站seo关键词布局/东莞百度搜索优化
  • 应用集成体系深度解析:从数据互通到流程协同
  • RV126平台NFS网络启动终极复盘报告
  • Excel批量生成SQL语句 Excel批量生成SQL脚本 Excel拼接sql
  • Unity 堆栈分析实战指南 C#
  • RAG深入了解P1:从RAG类型出发看优化点
  • vue中的this.$set