android rxjava2 简书,RXJava2学习

什么是RxJava

一个可观测的序列来组成异步的、基于事件的程序的库。(简单来说:它就是一个实现异步操作的库)

RxJava 好在哪?

RxJava 其实就是提供一套异步编程的 API,这套 API 是基于观察者模式的,而且是链式调用的,所以使用 RxJava 编写的代码的逻辑会非常简洁。

观察者模式

定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

作用是:解耦 UI层与具体的业务逻辑解耦

适用场景

数据库的读写、大图片的载入、文件压缩/解压等各种需要放在后台工作的耗时操作,都可以用 RxJava 来实现。

三个基本的元素

被观察者(Observable)

观察者(Observer)

onSubscribe() 订阅观察者的时候被调用

onNext() 发送该事件时,观察者会回调 onNext() 方法

onError() 发送该事件时,观察者会回调 onError() 方法,当发送该事件之后,其他事件将不会继续发送

onComplete() 发送该事件时,观察者会回调 onComplete() 方法,当发送该事件之后,其他事件将不会继续发送

订阅(subscribe)

连接观察者和被观察者

// 1. 通过creat()创建被观察者对象

Observable.create(new ObservableOnSubscribe() {

// 2. 在复写的subscribe()里定义需要发送的事件

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onNext(1);

emitter.onNext(2);

emitter.onNext(3);

emitter.onNext(4);

emitter.onComplete();

} // 至此,一个被观察者对象(Observable)就创建完毕

}).subscribe(new Observer() {

// 3. 通过通过订阅(subscribe)连接观察者和被观察者

// 4. 创建观察者 & 定义响应事件的行为

@Override

public void onSubscribe(Disposable d) {

Log.d(TAG, "开始采用subscribe连接");

}

// 默认最先调用复写的 onSubscribe()

@Override

public void onNext(Integer value) {

Log.d(TAG, "接收到了事件"+ value );

}

@Override

public void onError(Throwable e) {

Log.d(TAG, "对Error事件作出响应");

}

@Override

public void onComplete() {

Log.d(TAG, "对Complete事件作出响应");

}

});

五种被观察者

Observable Observable即被观察者,决定什么时候触发事件以及触发怎样的事件

Flowable Flowable可以看成是Observable的实现,只是它支持背压

Single 只有onSuccess可onError事件,只能用onSuccess发射一个数据或一个错误通知,之后再发射数据也不会做任何处理,直接忽略

Completable 只有onComplete和onError事件,不发射数据,没有map,flatMap操作符。常常结合andThen操作符使用

Maybe 没有onNext方法,同样需要onSuccess发射数据,且只能发射0或1个数据,多发也不再处理

/**

* Observable --- 被观察者

* create ---操作符

* ObservableEmitter --- 发射器向观察者发送事件

*/

Observable objectObservable = Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter emitter) throws Exception {

emitter.onNext("Observable");

emitter.onComplete();

}

});

// Flowable被观察者(背压)的创建

Flowable objectFlowable = Flowable.create(new FlowableOnSubscribe() {

@Override

public void subscribe(FlowableEmitter emitter) throws Exception {

}

}, BackpressureStrategy.BUFFER);

//Single 被观察者

Single.create(new SingleOnSubscribe() {

@Override

public void subscribe(SingleEmitter emitter) throws Exception {

}

}).subscribe(new SingleObserver() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onSuccess(Object o) {

}

@Override

public void onError(Throwable e) {

}

});

//Completable 被观察者

Completable.create(new CompletableOnSubscribe() {

@Override

public void subscribe(CompletableEmitter emitter) throws Exception {

}

});

//Maybe 被观察者

Maybe.create(new MaybeOnSubscribe() {

@Override

public void subscribe(MaybeEmitter emitter) throws Exception {

}

});

五种被观察者可通过toObservable,toFlowable,toSingle,toCompletable,toMaybe相互转换

操作符

1.创建操作符

create() : 创建一个被观察者

just() : 创建一个被观察者,并发送事件,发送的事件不可以超过10个以上

fromArray() : 这个方法和 just() 类似,只不过 fromArray 可以传入多于10个的变量,并且可以传入一个数组

fromCallable() : 这里的 Callable 是 java.util.concurrent 中的 Callable,Callable 和 Runnable 的用法基本一致,只是它会返回一个结果值,这个结果值就是发给观察者的

fromFuture() : 参数中的 Future 是 java.util.concurrent 中的 Future,Future 的作用是增加了 cancel() 等方法操作 Callable,它可以通过 get() 方法来获取 Callable 返回的值

fromIterable() : 直接发送一个 List 集合数据给观察者

defer() : 这个方法的作用就是直到被观察者被订阅后才会创建被观察者。

timer() : 当到指定时间后就会发送一个 0L 的值给观察者。

interval() : 每隔一段时间就会发送一个事件,这个事件是从0开始,不断增1的数字。

intervalRange() : 可以指定发送事件的开始值和数量,其他与 interval() 的功能一样。

range() : 同时发送一定范围的事件序列。

rangeLong() :作用与 range() 一样,只是数据类型为 Long

empty() : 直接发送 onComplete() 事件

never():不发送任何事件

error():发送 onError() 事件

Observable.just(1,2,3).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(Object integer) {

System.out.println("just===" + integer);

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

2,转换操作符

map() :map 可以将被观察者发送的数据类型转变成其他的类型

flatMap(): 这个方法可以将事件序列中的元素进行整合加工,返回一个新的被观察者。

concatMap() :concatMap() 和 flatMap() 基本上是一样的,只不过 concatMap() 转发出来的事件是有序的,而 flatMap() 是无序的

buffer() : 从需要发送的事件当中获取一定数量的事件,并将这些事件放到缓冲区当中一并发出

groupBy(): 将发送的数据进行分组,每个分组都会返回一个被观察者

scan() :将数据以一定的逻辑聚合起来

window() :发送指定数量的事件时,就将这些事件分为一组。window 中的 count 的参数就是代表指定的数量,例如将 count 指定为2,那么每发2个数据就会将这2个数据分成一组。

Observable.just(1,2,3,4,5,6)

.map(new Function() {

@Override

public String apply(Integer value) throws Exception {

//将integer转化成String

return "aa"+value;

}

}).subscribe(new Consumer() {

@Override

public void accept(String s) throws Exception {

System.out.println(s);

}

});

3,组合操作符

concat() :可以将多个观察者组合在一起,然后按照之前发送顺序发送事件。需要注意的是,concat() 最多只可以发送4个事件。

concatArray() : 与 concat() 作用一样,不过 concatArray() 可以发送多于 4 个被观察者。

merge() : 这个方法月 concat() 作用基本一样,知识 concat() 是串行发送事件,而 merge() 并行发送事件。

zip() :会将多个被观察者合并,根据各个被观察者发送事件的顺序一个个结合起来,最终发送的事件数量会与源 Observable 中最少事件的数量一样。

reduce() :与 scan() 操作符的作用也是将发送数据以一定逻辑聚合起来,这两个的区别在于 scan() 每处理一次数据就会将事件发送给观察者,而 reduce() 会将所有数据聚合在一起才会发送事件给观察者。

collect() : 将数据收集到数据结构当中

count() :返回被观察者发送事件的数量。

startWith() & startWithArray() : 在发送事件之前追加事件,startWith() 追加一个事件,startWithArray() 可以追加多个事件。追加的事件会先发出。

combineLatest() & combineLatestDelayError() :combineLatest() 的作用与 zip() 类似,但是 combineLatest() 发送事件的序列是与发送的时间线有关的,当 combineLatest() 中所有的 Observable 都发送了事件,只要其中有一个 Observable 发送事件,这个事件就会和其他 Observable 最近发送的事件结合起来发送

concatArrayDelayError() & mergeArrayDelayError() : 在 concatArray() 和 mergeArray() 两个方法当中,如果其中有一个被观察者发送了一个 Error 事件,那么就会停止发送事件,如果你想 onError() 事件延迟到所有被观察者都发送完事件后再执行的话,就可以使用 concatArrayDelayError() 和 mergeArrayDelayError()

Observable.concat(Observable.just(1,2),Observable.just(5,6),

Observable.just(3,4),Observable.just(7,8)).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(Integer integer) {

System.out.println(integer);

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

4,功能操作符

delay()

延迟一段时间发送事件。

doOnEach()

Observable 每发送一件事件之前都会先回调这个方法。

doOnNext()

Observable 每发送 onNext() 之前都会先回调这个方法。

doAfterNext()

Observable 每发送 onNext() 之后都会回调这个方法。

doOnComplete()

Observable 每发送 onComplete() 之前都会回调这个方法。

doOnError()

Observable 每发送 onError() 之前都会回调这个方法。

doOnSubscribe()

Observable 每发送 onSubscribe() 之前都会回调这个方法。

doOnDispose()

当调用 Disposable 的 dispose() 之后回调该方法

doOnLifecycle()

在回调 onSubscribe 之前回调该方法的第一个参数的回调方法,可以使用该回调方法决定是否取消订阅

doOnTerminate() & doAfterTerminate()

doOnTerminate 是在 onError 或者 onComplete 发送之前回调,而 doAfterTerminate 则是 onError 或者 onComplete 发送之后回调

doFinally()

在所有事件发送完毕之后回调该方法。

onErrorReturn()

当接受到一个 onError() 事件之后回调,返回的值会回调 onNext() 方法,并正常结束该事件序列

onErrorResumeNext()

当接收到 onError() 事件时,返回一个新的 Observable,并正常结束事件序列

onExceptionResumeNext()

与 onErrorResumeNext() 作用基本一致,但是这个方法只能捕捉 Exception。

retry()

如果出现错误事件,则会重新发送所有事件序列。times 是代表重新发的次数

retryWhen()

当被观察者接收到异常或者错误事件时会回调该方法,这个方法会返回一个新的被观察者。如果返回的被观察者发送 Error 事件则之前的被观察者不会继续发送事件,如果发送正常事件则之前的被观察者会继续不断重试发送事件

repeat()

重复发送被观察者的事件,times 为发送次数

repeatWhen()

这个方法可以会返回一个新的被观察者设定一定逻辑来决定是否重复发送事件。

subscribeOn()

指定被观察者的线程,要注意的时,如果多次调用此方法,只有第一次有效。

observeOn()

指定观察者的线程,每指定一次就会生效一次。

retryUntil()

出现错误事件之后,可以通过此方法判断是否继续发送事件。

Observable.just(1,2,3).delay(2, TimeUnit.SECONDS)

.subscribeOn(Schedulers.io())

.subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

System.out.println("onSubscribe()");

}

@Override

public void onNext(Integer integer) {

System.out.println(integer);

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

5,过滤操作符

filter()

通过一定逻辑来过滤被观察者发送的事件,如果返回 true 则会发送事件,否则不会发送

ofType()

可以过滤不符合该类型事件

skip()

跳过正序某些事件,count 代表跳过事件的数量

distinct()

过滤事件序列中的重复事件。

distinctUntilChanged()

过滤掉连续重复的事件

take()

控制观察者接收的事件的数量。

debounce()

如果两件事件发送的时间间隔小于设定的时间间隔则前一件事件就不会发送给观察者。

firstElement() && lastElement()

firstElement() 取事件序列的第一个元素,lastElement() 取事件序列的最后一个元素。

elementAt() & elementAtOrError()

elementAt() 可以指定取出事件序列中事件,但是输入的 index 超出事件序列的总数的话就不会出现任何结果。这种情况下,你想发出异常信息的话就用 elementAtOrError() 。

Observable.just(1,2,3).filter(new Predicate() {

@Override

public boolean test(Integer integer) throws Exception {

return integer < 3;

}

}).subscribe(new Observer() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(Integer integer) {

System.out.println(integer);

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

});

6,条件操作符

takeWhile()

可以设置条件,当某个数据满足条件时就会发送该数据,反之则不发送

skipWhile()

可以设置条件,当某个数据满足条件时不发送该数据,反之则发送。

takeUntil()

可以设置条件,当事件满足此条件时,下一次的事件就不会被发送了。

skipUntil()

当 skipUntil() 中的 Observable 发送事件了,原来的 Observable 才会发送事件给观察者。

sequenceEqual()

判断两个 Observable 发送的事件是否相同。

isEmpty()

判断事件序列是否为空。

amb()

amb() 要传入一个 Observable 集合,但是只会发送最先发送事件的 Observable 中的事件,其余 Observable 将会被丢弃

defaultIfEmpty()

如果观察者只发送一个 onComplete() 事件,则可以利用这个方法发送一个值

all()

判断事件序列是否全部满足某个事件,如果都满足则返回 true,反之则返回 false。

contains()

判断事件序列中是否含有某个元素,如果有则返回 true,如果没有则返回 false。

Observable.just(1,2,3,4,5).all(new Predicate() {

@Override

public boolean test(Integer integer) throws Exception {

return integer < 5;

}

}).subscribe(new Consumer() {

@Override

public void accept(Boolean aBoolean) throws Exception {

System.out.println("accept()===" + aBoolean);

}

});

线程切换

1,RxJava线程控制(调度/切换)的作用是什么?

指定 被观察者 (Observable) / 观察者(Observer) 的工作线程类型。

2,为什么要进行RxJava线程控制(调度/切换)?

在 RxJava模型中,被观察者 (Observable) / 观察者(Observer)的工作线程 = 创建自身的线程

对于一般的需求场景,需要在子线程中实现耗时的操作;然后回到主线程实现 UI操作

应用到 RxJava模型中,可理解为:

被观察者 (Observable) 在 子线程 中生产事件(如实现耗时操作等等)

观察者(Observer)在 主线程 接收 & 响应事件(即实现UI操作)

3,实现方式

采用 RxJava内置的线程调度器( Scheduler ),即通过 功能性操作符subscribeOn() & observeOn()实现

subscribeOn

通过接收一个Scheduler参数,来指定对数据的处理运行在特定的线程调度器Scheduler上。若多次设定,则只有一次起作用。

observeOn

接收一个Scheduler参数,来指定下游操作运行在特定的线程调度器Scheduler上。若多次设定,每次均起作用。

Scheduler种类

类型

含义

Schedulers.io( )

用于IO密集型的操作,例如读写SD卡文件,查询数据库,访问网络等,具有线程缓存机制,在此调度器接收到任务后,先检查线程缓存池中,是否有空闲的线程,如果有,则复用,如果没有则创建新的线程,并加入到线程池中,如果每次都没有空闲线程使用,可以无上限的创建新线程。

Schedulers.newThread( )

在每执行一个任务时创建一个新的线程,不具有线程缓存机制,因为创建一个新的线程比复用一个线程更耗时耗力,虽然使用Schedulers.io( )的地方,都可以使用Schedulers.newThread( ),但是,Schedulers.newThread( )的效率没有Schedulers.io( )高。

Schedulers.computation():

用于CPU 密集型计算任务,即不会被 I/O 等操作限制性能的耗时操作,例如xml,json文件的解析,Bitmap图片的压缩取样等,具有固定的线程池,大小为CPU的核数。不可以用于I/O操作,因为I/O操作的等待时间会浪费CPU。

Schedulers.trampoline():

在当前线程立即执行任务,如果当前线程有任务在执行,则会将其暂停,等插入进来的任务执行完之后,再将未完成的任务接着执行。

Schedulers.single():

拥有一个线程单例,所有的任务都在这一个线程中执行,当此线程中有任务执行时,其他任务将会按照先进先出的顺序依次执行。

Scheduler.from(@NonNull Executor executor):

指定一个线程调度器,由此调度器来控制任务的执行策略。

AndroidSchedulers.mainThread():

在Android UI线程中执行任务,为Android开发定制。

具体使用

// Observable.subscribeOn(Schedulers.Thread):指定被观察者 发送事件的线程(传入RxJava内置的线程类型)

// Observable.observeOn(Schedulers.Thread):指定观察者 接收 & 响应事件的线程(传入RxJava内置的线程类型)

// 通过订阅(subscribe)连接观察者和被观察者

observable.subscribeOn(Schedulers.newThread()) // 1. 指定被观察者 生产事件的线程

.observeOn(AndroidSchedulers.mainThread()) // 2. 指定观察者 接收 & 响应事件的线程

.subscribe(observer); // 3. 最后再通过订阅(subscribe)连接观察者和被观察者

背压

1,出现原因

当上下游在不同的线程中,通过Observable发射,处理,响应数据流时,如果上游发射数据的速度快于下游接收处理数据的速度,这样对于那些没来得及处理的数据就会造成积压,这些数据既不会丢失,也不会被垃圾回收机制回收,而是存放在一个异步缓存池中,如果缓存池中的数据一直得不到处理,越积越多,最后就会造成内存溢出,这便是响应式编程中的背压(backpressure)问题

cdef2602353f

944365-a8ca5dd7f71bd781.webp.jpg

2,解决方法

使用BackpressureStrategy背压策略

cdef2602353f

944365-37ae2f5f93d9326c.webp.jpg

RxJava2.0实施背压策略后与RxJava1.0未实施对比

cdef2602353f

944365-c01363ed15386193.webp.jpg

背压的具体实现:Flowable

cdef2602353f

944365-ceca5a724ce25985.webp.jpg

与 RxJava1.0 中被观察者的旧实现 Observable 的关系

cdef2602353f

944365-025e8828a7dd1fd9.webp.jpg

Flowable的基础使用非常类似于Observable

/**

* 步骤1:创建被观察者 = Flowable

*/

Flowable upstream = Flowable.create(new FlowableOnSubscribe() {

@Override

public void subscribe(FlowableEmitter emitter) throws Exception {

emitter.onNext(1);

emitter.onNext(2);

emitter.onNext(3);

emitter.onComplete();

}

}, BackpressureStrategy.ERROR);

// 需要传入背压参数BackpressureStrategy,下面会详细说明

/**

* 步骤2:创建观察者 = Subscriber

*/

Subscriber downstream = new Subscriber() {

@Override

public void onSubscribe(Subscription s) {

// 对比Observer传入的Disposable参数,Subscriber此处传入的参数 = Subscription

// 相同点:Subscription具备Disposable参数的作用,即Disposable.dispose()切断连接, 同样的调用Subscription.cancel()切断连接

// 不同点:Subscription增加了void request(long n)

Log.d(TAG, "onSubscribe");

s.request(Long.MAX_VALUE);

// 关于request()下面会继续详细说明

}

@Override

public void onNext(Integer integer) {

Log.d(TAG, "onNext: " + integer);

}

@Override

public void onError(Throwable t) {

Log.w(TAG, "onError: ", t);

}

@Override

public void onComplete() {

Log.d(TAG, "onComplete");

}

};

/**

* 步骤3:建立订阅关系

*/

upstream.subscribe(downstream);

BackpressureStrategy背压参数

策略

意义

MISSING

MissingEmitter

在此策略下,通过Create方法创建的Flowable相当于没有指定背压策略,不会对通过onNext发射的数据做缓存或丢弃处理,需要下游通过背压操作符

ERROR

ErrorAsyncEmitter

在此策略下,如果放入Flowable的异步缓存池中的数据超限了,则会抛出MissingBackpressureException异常

BUFFER

BufferAsyncEmitter

部维护了一个缓存池SpscLinkedArrayQueue,其大小不限,此策略下,如果Flowable默认的异步缓存池满了,会通过此缓存池暂存数据,它与Observable的异步缓存池一样,可以无限制向里添加数据,不会抛出MissingBackpressureException异常,但会导致OOM

DROP

DropAsyncEmitter

在此策略下,如果Flowable的异步缓存池满了,会丢掉上游发送的数据

LATEST

LatestAsyncEmitter

与Drop策略一样,如果缓存池满了,会丢掉将要放入缓存池中的数据,不同的是,不管缓存池的状态如何,LATEST都会将最后一条数据强行放入缓存池中,来保证观察者在接收到完成通知之前,能够接收到Flowable最新发射的一条数据

Subscription

响应式拉取方式,来设置下游对数据的请求数量,上游可以根据下游的需求量,按需发送数据,如果不显示调用request()则默认下游的需求量为零,所以运行上面的代码后,上游Flowable发射的数据不会交给下游Subscriber处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无尽包围html5游戏在线玩,小团体激发潜能小游戏突破自我

缩小包围圈游戏其实是一个不可能完成的任务&#xff0c;但是它会给游戏者带来无尽欢笑&#xff0c;使小组充满活力&#xff0c;让队员们能够自然地进行身体接触和配合&#xff0c;消除害羞和忸怩感&#xff0c;创造融洽的气氛&#xff0c;为后续工作的开展奠定良好基础。可以作…

html5鼠标下拉浮窗固定,【前端技术】vue-floating-menu可拖拽吸附的浮窗菜单

前言正如这个名字&#xff0c;这是一个具有拖拽吸附功能的浮窗菜单&#xff0c;开源项目一个基于 vue 的浮窗组件,可在屏幕内自由拖拽&#xff0c;拖拽后可以根据最后的位置吸附到页面两边&#xff0c;而且可以点击浮窗显示菜单效果如下:遇到的问题总结鼠标移动过快&#xff0c…

html vba 单元格 格式,VBA设置单元格格式之——字体

009 设置单元格格式之字体(文档下载&#xff1a;关注本公众号&#xff0c;发送消息【教程】即可获得)通过VBA对单元格字体进行设置也是比较常用的方式&#xff0c;那么本节内容我们就来学习如何使用VBA对单元格中的字体进行设置。如图所示&#xff0c;字体设置主要有&#xff0…

2021聊城二中高考成绩查询,聊城中考成绩查询时间2021

聊城市2021年中考查分时间大约是6月27日。各普通高中要于7月10日前在校内张榜公布录取考生名单&#xff0c;并签发录取通知书。聊城中考录取时间各普通高中要于7月10日前在校内张榜公布录取考生名单&#xff0c;并签发录取通知书。所有学校均不得违规招收已被其他学校录取的考生…

桂林电子科技大学计算机信息管理专业排名,桂林电子科技大学信息科技学院优势专业排名,2021年桂林电子科技大学信息科技学院最好的专业排名...

桂林电子科技大学优势专业由桂林电子科技大学历届学长学姐实名推荐&#xff1a;1、通信工程 推荐指数: 4.8(156人推荐)2、电子信息工程 推荐指数: 4.6(135人推荐)3、机械设计制造及其自动化 推荐指数: 4.6(114人推荐)4、电气工程及其自动化 推荐指数: 4.5(93人推荐)5、测控技术…

计算机网络五层模型以及数据单元,计算机网络OSI模型、TCP/IP模型与5G协议

一、 OSI参考模型国际标准化组织(ISO)在1984年颁布了开放系统互连参考模型(OSI)&#xff0c;这是一个开放式的体系结构&#xff0c;将网络分为了七层。这七层分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。1.1 七层模型的功能分层功能应用层网络服务与最…

台式机计算机怎么分割,编辑手把手教程 如何给电脑硬盘分区

1找到磁盘管理工具目前主流的电脑&#xff0c;都预装了正版Win7操作系统&#xff0c;相信就算没有安装系统&#xff0c;朋友们在买到新电脑后的第一件事就是安装Windows操作系统。虽然Win8操作系统即将面世&#xff0c;但Win7操作系统的市场占有率已跟经典的Windows XP操作系统…

银行柜员网申计算机水平要求高吗,银行网申没通过,是因为你水平差吗?

原标题&#xff1a;银行网申没通过&#xff0c;是因为你水平差吗&#xff1f;近段时间&#xff0c;各进银行陆续开设网申通道&#xff0c;各位憧憬进入到银行工作的学员也在紧张的网申材料准备中。根据往年的经验来看&#xff0c;会有学员对小编吐槽“同学都收到网申通过的通知…

辽宁沈阳计算机学校王斯琪,青春正好,理所当“燃”——沈阳万合技校开展2020-2021年度春季学期跳大绳比赛...

原标题&#xff1a;青春正好&#xff0c;理所当“燃”——沈阳万合技校开展2020-2021年度春季学期跳大绳比赛辽宁万合职业教育集团Liaoning Wanhe Vocational Education Group沈阳万合职业技术学校Shenyang Wanhe vocational and technical school跳跃奔跑的身影&#xff0c;爽…

win10计算机系统优化设置,win10系统优化系统的详细办法

作为大多数用户都使用的win10系统&#xff0c;如果发生对win10系统优化系统进行设置情况&#xff0c;会让人束手无策&#xff0c;那么win10系统优化系统是怎么设置的呢&#xff1f;如果有朋友想对win10系统优化系统进行设置的话&#xff0c;按照1、右键点击“此电脑”&#xff…

arm放弃服务器芯片,ARM溃败:Applied Micro拆分ARM架构服务器芯片业务

上月下旬通信芯片厂商MACOM达成最终协议以约7.7亿美元收购Applied Micro&#xff0c;日前则已决定只留下后者的高速载波和数据中心连网芯片业务&#xff0c;分拆它的ARM架构服务器芯片业务&#xff0c;这对ARM在服务器芯片市场造成了重击&#xff0c;对于Intel来说则是重大喜讯…

计算机硬盘写入错误怎么办,电脑提示缓存文件写入失败

非正常电脑关引起的&#xff1a;如果是非正常关电脑引起的写入缓存失败&#xff0c;那就在【运行】中输入【CHKDSK 盘符】。系统错误&#xff1a;1&#xff0c;打开我的电脑&#xff0c;打开本地磁盘属性&#xff0c;在弹出的对话框中选择【工具】--【开始检查】&#xff0c;2&…

win2008验证服务器错误,win2008dcdiag检测出的错误,求解决方法

win2008dcdiag检测出的错误目录服务器诊断正在执行初始化设置:正在尝试查找主服务器...主服务器 SPS003* 已识别的 AD 林。已完成收集初始化信息。正在进行所需的初始化测试正在测试服务器: Default-First-Site-Name\SPS003开始测试: Connectivity......................... S…

ajax 405报错,使用ajax请求时发生随机HTTP错误405

我收到HTTP错误405动词不允许。由于有时代码有效&#xff0c;并且有时会抛出http 405错误&#xff0c;所以我需要了解这是编程问题还是服务器配置问题。我用jQuery使用ajax。我在这里浏览了所有相关的帖子&#xff0c;并尝试了与代码相关的所有推荐选项。请帮忙。使用ajax请求时…

我的世界服务器修改末地难度,涨姿势啦!我的世界老司机带你解锁进入末地的高难度姿势!...

我的世界中国版从发布至今已经有八年的时光了&#xff0c;很多玩家从一开始就陪着我的世界成长&#xff0c;可以说是看着它长大的了。如果你是我的世界的忠实玩家&#xff0c;那么你肯定知道进入末地的唯一渠道就是末地门啦&#xff0c;但是坏坏今天来就是来告诉你们进入大名鼎…

Vue-cli项目中mockjs + axios实现前后端分离代码demo(清晰易懂)

基础准备&#xff1a;1、npm安装vue-cli脚手架后&#xff0c;通过命令“ vue init webpack 项目名 ”来创建项目&#xff1b;2、了解mockjs&#xff0c;能拦截ajax请求&#xff0c;返回模拟的响应数据&#xff0c;实现前后端分离&#xff1b;&#xff08;详细学习网址&#xff…

绘制扇形的多种方式,包括border-radius、clip裁剪显示、canvas原点变换等方式的详细理解及demo

对clip的理解&#xff1a; clip是对使用了该样式的元素进行裁剪显示。使用方法是rect (top, right, bottom, left) 其中参数top代表显示的区域上边界离该元素顶部border-top相对距离&#xff0c;依此分别是右边界离该元素左侧border-left相对距离。参数top和left取值auto时候代…

CSS文字或元素的水平垂直居中多种方式(简单明了)

前言&#xff1a;水平居中&#xff0c;我们可以很容易想到使用text-align实现文字水平居中&#xff0c;使用margin:0px auto;可以实现元素水平居中&#xff1b;所以重点将是怎么实现文字和元素的垂直居中&#xff1f;&#xff1f; --- 本文将通过举栗子说明各种解决方式&#x…

Vue-cli 项目打包布署(简单清晰)

第一步&#xff1a;项目打包前更改项目config配置 打开项目的 config>index.js文件修改build对象的assetsPublicPath: 属性值为 ./ 如下 第二步&#xff1a;对vue-cli项目进行打包 在运行窗口输入cmd后打开命令窗口&#xff0c;在项目文件下输入npm run build命令 如下&…

Vue-cli项目中路由的基础用法,以及路由嵌套

文件目录&#xff1a; 编辑router文件夹下的index.js文件 第一步&#xff1a;引用vue和vue-router &#xff0c;Vue.use&#xff08;VueRouter&#xff09; /* eslint-disable*/ import Vue from vue import Router from vue-router Vue.use(Router) 第二步&#xff1a;引用…