此处将为大家介绍关于RxJavanoClassDefFoundError:API16上的rx.plugins.RxJavaPlugins的详细内容,并且为您解答有关rxjavaobservable的相
此处将为大家介绍关于RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins的详细内容,并且为您解答有关rxjava observable的相关问题,此外,我们还将为您介绍关于Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程、android – java.lang.AssertionError:意外的节点Pythonid; nodes = [org.jetbrains.plugins.terminal,org.jetbrains.plugins.javaFX、android-同一项目中的RxJava 1和RxJava 2、API 16上的RxJava noClassDefFoundError:rx.plugins.RxJavaPlugins的有用信息。
本文目录一览:- RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins(rxjava observable)
- Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
- android – java.lang.AssertionError:意外的节点Pythonid; nodes = [org.jetbrains.plugins.terminal,org.jetbrains.plugins.javaFX
- android-同一项目中的RxJava 1和RxJava 2
- API 16上的RxJava noClassDefFoundError:rx.plugins.RxJavaPlugins
RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins(rxjava observable)
我正在使用RxJava和Retofit开发一个Android应用程序。当我在API 23上测试代码时,没有错误,但是在API
15中测试时,我的RxJava似乎无法正常工作,并且我的应用程序因错误而崩溃:
FATAL EXCEPTION: mainjava.lang.ExceptionInInitializerErrorat $Proxy1.createToken(Native Method)at com.loginsignup.presenter.LoginPresenterImpl.tryToLogin(LoginPresenterImpl.java:39)at com.loginsignup.view.LoginActivity.tryToLogin(LoginActivity.java:197)at com.loginsignup.view.LoginActivity.onClick(LoginActivity.java:180)at android.view.View.performClick(View.java:4084)at android.view.View$PerformClick.run(View.java:16966)at android.os.Handler.handleCallback(Handler.java:615)at android.os.Handler.dispatchMessage(Handler.java:92)at android.os.Looper.loop(Looper.java:137)at android.app.ActivityThread.main(ActivityThread.java:4745)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:511)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)at dalvik.system.NativeStart.main(Native Method)Caused by: java.lang.NoClassDefFoundError: rx.plugins.RxJavaPluginsat rx.Observable.<clinit>(Observable.java:63)at $Proxy1.createToken(Native Method) at com.gooroo.gooroo.loginsignup.presenter.LoginPresenterImpl.tryToLogin(LoginPresenterImpl.java:39) at com.gooroo.gooroo.loginsignup.view.LoginActivity.tryToLogin(LoginActivity.java:197) at com.gooroo.gooroo.loginsignup.view.LoginActivity.onClick(LoginActivity.java:180) at android.view.View.performClick(View.java:4084) at android.view.View$PerformClick.run(View.java:16966) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)
这是我的gradle构建:
apply plugin: ''com.android.application''android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.example.ex" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "0.1 alpha" multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } } dexOptions { javaMaxHeapSize "4g" }}dependencies { compile fileTree(include: [''*.jar''], dir: ''libs'') testCompile ''junit:junit:4.12'' debugCompile ''com.squareup.leakcanary:leakcanary-android:1.4-beta2'' releaseCompile ''com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'' testCompile ''com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'' compile files(''libs/sinch-android-rtc-3.9.5.jar'') compile ''com.android.support:appcompat-v7:23.4.0'' compile ''com.android.support:design:23.4.0'' compile ''com.android.support:support-v4:23.4.0'' compile ''com.android.support:cardview-v7:23.4.0'' compile ''com.google.android.gms:play-services-maps:8.4.0'' compile ''com.google.android.gms:play-services-location:8.4.0'' compile ''com.google.code.gson:gson:2.6.2'' compile ''com.google.android.gms:play-services-analytics:8.4.0'' compile ''com.squareup.picasso:picasso:2.5.2'' compile ''com.squareup.okhttp3:okhttp-urlconnection:3.2.0'' compile ''com.squareup.okhttp3:okhttp:3.2.0'' compile ''com.squareup.okhttp3:logging-interceptor:3.2.0'' compile ''com.squareup.retrofit2:retrofit:2.0.0'' compile ''com.squareup.retrofit2:converter-gson:2.0.0'' compile ''com.squareup.retrofit2:adapter-rxjava:2.0.0'' compile ''com.github.orhanobut:logger:1.12'' compile ''com.viewpagerindicator:library:2.4.1@aar'' compile ''io.reactivex:rxandroid:1.2.0'' compile ''io.reactivex:rxjava:1.1.5'' compile ''com.facebook.android:facebook-android-sdk:4.+'' compile ''com.stripe:stripe-android:+'' compile ''com.google.android.gms:play-services-gcm:8.4.0'' compile ''com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'' compile ''com.amazonaws:aws-android-sdk-core:2.+'' compile ''com.amazonaws:aws-android-sdk-s3:2.+'' compile ''com.google.android.gms:play-services-wallet:8.4.0'' compile ''com.android.support:multidex:1.0.0''}apply plugin: ''com.google.gms.google-services''
知道为什么API 23上没有问题,但是当我在API 16上运行它时,当我尝试使用RxJava登录时崩溃了吗?
答案1
小编典典这里的问题可能是您尚未初始化MultiDex Option
对Android 5.0及更高版本的Multidex支持
Android
5.0及更高版本使用称为ART的运行时,它本身支持从应用程序APK文件加载多个dex文件。ART在应用程序安装时执行预编译,该预编译将扫描classes(..
N).dex文件并将其编译为单个.oat文件,以供Android设备执行。有关Android
5.0运行时的更多信息,请参见ART简介。这就是您的应用在API级别21上可以正常运行的原因。
Android 5.0之前的Multidex支持
Android
5.0之前的平台版本使用Dalvik运行时执行应用程序代码。默认情况下,Dalvik将每个APK的应用程序限制为单个classes.dex字节码文件。为了解决此限制,您可以使用multidex支持库,该库成为应用程序主DEX文件的一部分,然后管理对其他DEX文件及其包含的代码的访问。
因此,首先确保您已导入正确的依赖关系,看来您确实做到了。
dependencies { compile ''com.android.support:multidex:1.0.0''}
在清单中,将MultiDexApplication
来自multidex支持库的类添加到application元素。
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.multidex.myapplication"> <application ... // This will solved the problem android:name="YourAppName"> ... </application></manifest>
这就是我解决我的问题的方法,即使有关于它的封闭Git问题。
编辑
public class YouAppName extends MultiDexApplication { .. ..}
希望对您有所帮助。
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
原文:https://www.jianshu.com/p/a406b94f3188
前言
Rxjava
由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大Android
开发者的欢迎。
Github截图
- 本文主要:
- 面向 刚接触
Rxjava
的初学者 - 提供了一份 清晰、简洁、易懂的
Rxjava
入门教程
涵盖 基本介绍、原理 & 具体使用等
- 解决的是初学者不理解
Rxjava
原理 & 不懂得如何使用的问题
- 面向 刚接触
希望你们会喜欢。
- 本文主要基于
Rxjava 2.0
- 如果读者还没学习过
Rxjava 1.0
也没关系,因为Rxjava 2.0
只是在Rxjava 1.0
上增加了一些新特性,本质原理 & 使用基本相同- 接下来的时间,我将持续推出
Android
中Rxjava 2.0
的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!
示意图
目录
示意图
1. 定义
RxJava
在GitHub
的介绍:
RxJava:a library for composing asynchronous and event-based programs using observable sequences for the Java VM
// 翻译:RxJava 是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
- 总结:
RxJava
是一个 基于事件流、实现异步操作的库
2. 作用
实现异步操作
类似于
Android
中的AsyncTask
、Handler
作用
3. 特点
由于 RxJava
的使用方式是:基于事件流的链式调用,所以使得 RxJava
:
- 逻辑简洁
- 实现优雅
- 使用简单
更重要的是,随着程序逻辑的复杂性提高,它依然能够保持简洁 & 优雅
4. 原理
4.1 生活例子引入
- 我用一个生活例子引入 & 讲解
Rxjava
原理: 顾客到饭店吃饭
示意图
流程图
4.2 Rxjava原理介绍
-
Rxjava
原理 基于 一种扩展的观察者模式 -
Rxjava
的扩展观察者模式中有4个角色:
角色 | 作用 | 类比 |
---|---|---|
被观察者(Observable) | 产生事件 | 顾客 |
观察者(Observer) | 接收事件,并给出响应动作 | 厨房 |
订阅(Subscribe) | 连接 被观察者 & 观察者 | 服务员 |
事件(Event) | 被观察者 & 观察者 沟通的载体 | 菜式 |
- 具体原理
请结合上述 顾客到饭店吃饭 的生活例子理解:
示意图
流程图
即RxJava
原理可总结为:被观察者 (Observable)
通过 订阅(Subscribe)
按顺序发送事件 给观察者 (Observer)
, 观察者(Observer)
按顺序接收事件 & 作出对应的响应动作。具体如下图:
示意图
至此,RxJava
原理讲解完毕。
5. 基本使用
- 本文只关注
RxJava
的基本使用,更深入的RxJava
使用请继续关注Carson_Ho的RxJava系列 Rxjava
的使用方式有两种:- 分步骤实现:该方法主要为了深入说明
Rxjava
的原理 & 使用,主要用于演示说明 - 基于事件流的链式调用:主要用于实际使用
- 分步骤实现:该方法主要为了深入说明
5.1 方式1:分步骤实现
5.1.1 使用步骤
示意图
5.1.2 步骤详解
步骤1:创建被观察者 (Observable
)& 生产事件
- 即 顾客入饭店 - 坐下餐桌 - 点菜
- 具体实现
// 1. 创建被观察者 Observable 对象
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
// create() 是 RxJava 最基本的创造事件序列的方法
// 此处传入了一个 OnSubscribe 对象参数
// 当 Observable 被订阅时,OnSubscribe 的 call() 方法会自动被调用,即事件序列就会依照设定依次被触发
// 即观察者会依次调用对应事件的复写方法从而响应事件
// 从而实现被观察者调用了观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
// 2. 在复写的subscribe()里定义需要发送的事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
// 通过 ObservableEmitter类对象产生事件并通知观察者
// ObservableEmitter类介绍
// a. 定义:事件发射器
// b. 作用:定义需要发送的事件 & 向观察者发送事件
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
});
<--扩展:RxJava 提供了其他方法用于 创建被观察者对象Observable -->
// 方法1:just(T...):直接将传入的参数依次发送出来
Observable observable = Observable.just("A", "B", "C");
// 将会依次调用:
// onNext("A");
// onNext("B");
// onNext("C");
// onCompleted();
// 方法2:from(T[]) / from(Iterable<? extends T>) : 将传入的数组 / Iterable 拆分成具体对象后,依次发送出来
String[] words = {"A", "B", "C"};
Observable observable = Observable.from(words);
// 将会依次调用:
// onNext("A");
// onNext("B");
// onNext("C");
// onCompleted();
步骤2:创建观察者 (Observer
)并 定义响应事件的行为
- 即 开厨房 - 确定对应菜式
- 发生的事件类型包括:
Next
事件、Complete
事件 &Error
事件。具体如下:
示意图
- 具体实现
<--方式1:采用Observer 接口 -->
// 1. 创建观察者 (Observer )对象
Observer<Integer> observer = new Observer<Integer>() {
// 2. 创建对象时通过对应复写对应事件方法 从而 响应对应事件
// 观察者接收事件前,默认最先调用复写 onSubscribe()
@Override
public void onSubscribe(disposable d) {
Log.d(TAG, "开始采用subscribe连接");
}
// 当被观察者生产Next事件 & 观察者接收到时,会调用该复写方法 进行响应
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件作出响应" + value);
}
// 当被观察者生产Error事件& 观察者接收到时,会调用该复写方法 进行响应
@Override
public void one rror(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
// 当被观察者生产Complete事件& 观察者接收到时,会调用该复写方法 进行响应
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
};
<--方式2:采用Subscriber 抽象类 -->
// 说明:Subscriber类 = RxJava 内置的一个实现了 Observer 的抽象类,对 Observer 接口进行了扩展
// 1. 创建观察者 (Observer )对象
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
// 2. 创建对象时通过对应复写对应事件方法 从而 响应对应事件
// 观察者接收事件前,默认最先调用复写 onSubscribe()
@Override
public void onSubscribe(Subscription s) {
Log.d(TAG, "开始采用subscribe连接");
}
// 当被观察者生产Next事件 & 观察者接收到时,会调用该复写方法 进行响应
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件作出响应" + value);
}
// 当被观察者生产Error事件& 观察者接收到时,会调用该复写方法 进行响应
@Override
public void one rror(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
// 当被观察者生产Complete事件& 观察者接收到时,会调用该复写方法 进行响应
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
};
<--特别注意:2种方法的区别,即Subscriber 抽象类与Observer 接口的区别 -->
// 相同点:二者基本使用方式完全一致(实质上,在RxJava的 subscribe 过程中,Observer总是会先被转换成Subscriber再使用)
// 不同点:Subscriber抽象类对 Observer 接口进行了扩展,新增了两个方法:
// 1. onStart():在还未响应事件前调用,用于做一些初始化工作
// 2. unsubscribe():用于取消订阅。在该方法被调用后,观察者将不再接收 & 响应事件
// 调用该方法前,先使用 isUnsubscribed() 判断状态,确定被观察者Observable是否还持有观察者Subscriber的引用,如果引用不能及时释放,就会出现内存泄露
步骤3:通过订阅(Subscribe
)连接观察者和被观察者
- 即 顾客找到服务员 - 点菜 - 服务员下单到厨房 - 厨房烹调
- 具体实现
observable.subscribe(observer);
// 或者 observable.subscribe(subscriber);
- 扩展说明
<-- Observable.subscribe(Subscriber) 的内部实现 -->
public Subscription subscribe(Subscriber subscriber) {
subscriber.onStart();
// 步骤1中 观察者 subscriber抽象类复写的方法,用于初始化工作
onSubscribe.call(subscriber);
// 通过该调用,从而回调观察者中的对应方法从而响应被观察者生产的事件
// 从而实现被观察者调用了观察者的回调方法 & 由被观察者向观察者的事件传递,即观察者模式
// 同时也看出:Observable只是生产事件,真正的发送事件是在它被订阅的时候,即当 subscribe() 方法执行时
}
5.2 方式2:优雅的实现方法 - 基于事件流的链式调用
- 上述的实现方式是为了说明
Rxjava
的原理 & 使用 - 在实际应用中,会将上述步骤&代码连在一起,从而更加简洁、更加优雅,即所谓的
RxJava
基于事件流的链式调用
// RxJava的链式操作
Observable.create(new ObservableOnSubscribe<Integer>() {
// 1. 创建被观察者 & 生产事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
// 2. 通过通过订阅(subscribe)连接观察者和被观察者
// 3. 创建观察者 & 定义响应事件的行为
@Override
public void onSubscribe(disposable d) {
Log.d(TAG, "开始采用subscribe连接");
}
// 默认最先调用复写的 onSubscribe()
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件"+ value +"作出响应" );
}
@Override
public void one rror(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
});
}
}
注:整体方法调用顺序:观察者.onSubscribe()> 被观察者.subscribe()> 观察者.onNext()>观察者.onComplete()
这种 基于事件流的链式调用,使得RxJava
:
- 逻辑简洁
- 实现优雅
- 使用简单
更重要的是,随着程序逻辑的复杂性提高,它依然能够保持简洁 & 优雅。所以,一般建议使用这种基于事件流的链式调用方式实现RxJava
。
特别注意
RxJava 2.x
提供了多个函数式接口 ,用于实现简便式的观察者模式。具体如下:
示意图
以 Consumer
为例:实现简便式的观察者模式
Observable.just("hello").subscribe(new Consumer<String>() {
// 每次接收到Observable的事件都会调用Consumer.accept()
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
6. 实例说明
我将用一个实际工程实例来演示 Rxjava
的使用
6.1 方式1:分步骤实现
步骤1:加入依赖
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
步骤2:直接在MainActivity.java
中实现下述步骤
- 创建被观察者
(Observable )
& 生产事件 - 创建观察者
(Observer )
并 定义响应事件的行为 - 通过订阅
(Subscribe)
连接观察者和被观察者
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Rxjava";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 步骤1:创建被观察者 Observable & 生产事件
// 即 顾客入饭店 - 坐下餐桌 - 点菜
// 1. 创建被观察者 Observable 对象
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
// 2. 在复写的subscribe()里定义需要发送的事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
// 通过 ObservableEmitter类对象产生事件并通知观察者
// ObservableEmitter类介绍
// a. 定义:事件发射器
// b. 作用:定义需要发送的事件 & 向观察者发送事件
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
});
// 步骤2:创建观察者 Observer 并 定义响应事件行为
// 即 开厨房 - 确定对应菜式
Observer<Integer> observer = new Observer<Integer>() {
// 通过复写对应方法来 响应 被观察者
@Override
public void onSubscribe(disposable d) {
Log.d(TAG, "开始采用subscribe连接");
}
// 默认最先调用复写的 onSubscribe()
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件"+ value +"作出响应" );
}
@Override
public void one rror(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
};
// 步骤3:通过订阅(subscribe)连接观察者和被观察者
// 即 顾客找到服务员 - 点菜 - 服务员下单到厨房 - 厨房烹调
observable.subscribe(observer);
- 测试结果
示意图
6.2 方式2:基于事件流的链式调用方式
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Rxjava";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// RxJava的流式操作
Observable.create(new ObservableOnSubscribe<Integer>() {
// 1. 创建被观察者 & 生产事件
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
// 2. 通过通过订阅(subscribe)连接观察者和被观察者
// 3. 创建观察者 & 定义响应事件的行为
@Override
public void onSubscribe(disposable d) {
Log.d(TAG, "开始采用subscribe连接");
}
// 默认最先调用复写的 onSubscribe()
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件"+ value +"作出响应" );
}
@Override
public void one rror(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
});
}
}
-
测试效果
实现效果同上示意图
-
Demo 下载地址
Carson_Ho的Github地址 = RxJava2系列:基础使用
喜欢的麻烦点个
star
!
7. 额外说明
7.1 被观察者 Observable的subscribe()具备多个重载的方法
public final disposable subscribe() {}
// 表示观察者不对被观察者发送的事件作出任何响应(但被观察者还是可以继续发送事件)
public final disposable subscribe(Consumer<? super T> onNext) {}
// 表示观察者只对被观察者发送的Next事件作出响应
public final disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> one rror) {}
// 表示观察者只对被观察者发送的Next事件 & Error事件作出响应
public final disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> one rror, Action onComplete) {}
// 表示观察者只对被观察者发送的Next事件、Error事件 & Complete事件作出响应
public final disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> one rror, Action onComplete, Consumer<? super disposable> onSubscribe) {}
// 表示观察者只对被观察者发送的Next事件、Error事件 、Complete事件 & onSubscribe事件作出响应
public final void subscribe(Observer<? super T> observer) {}
// 表示观察者对被观察者发送的任何事件都作出响应
7.2 可采用 disposable.dispose() 切断观察者 与 被观察者 之间的连接
- 即观察者 无法继续 接收 被观察者的事件,但被观察者还是可以继续发送事件
- 具体使用
// 主要在观察者 Observer中 实现
Observer<Integer> observer = new Observer<Integer>() {
// 1. 定义disposable类变量
private disposable mdisposable;
@Override
public void onSubscribe(disposable d) {
Log.d(TAG, "开始采用subscribe连接");
// 2. 对disposable类变量赋值
mdisposable = d;
}
@Override
public void onNext(Integer value) {
Log.d(TAG, "对Next事件"+ value +"作出响应" );
if (value == 2) {
// 设置在接收到第二个事件后切断观察者和被观察者的连接
mdisposable.dispose();
Log.d(TAG, "已经切断了连接:" + mdisposable.isdisposed());
}
}
@Override
public void one rror(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}
@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
};
- 效果图
示意图
8. 总结
- 本文主要对
Rxjava
的入门知识进行讲解,包括基本介绍、原理 & 具体使用等 - 接下来,我将持续推出
Android
中Rxjava 2.0
的一系列文章,包括原理、操作符、应用场景、背压等等
示意图
感兴趣的同学可以继续关注本人运营的Wechat Public Account
:
- 我想给你们介绍一个与众不同的Android微信公众号(福利回赠)
- 我想邀请您和我一起写Android(福利回赠)
请点赞!因为你的鼓励是我写作的最大动力!
相关文章阅读
- 操作符使用
Android:这是一篇 清晰 & 易懂的Rxjava 入门教程
Android RxJava:最基础的操作符详解 - 创建操作符
Android RxJava:图文详解 变换操作符
Android RxJava:组合 / 合并操作符 详细教程
Android RxJava:功能性操作符 全面讲解- 实际应用讲解
Android RxJava 实际应用讲解:(无条件)网络请求轮询
Android RxJava 实际应用讲解:(有条件)网络请求轮询
Android RxJava 实际应用讲解:网络请求嵌套回调
Android RxJava 实际应用讲解:合并数据源
Android RxJava 实际应用讲解:从磁盘 / 内存缓存中 获取缓存数据
Android RxJava 实际应用讲解:联合判断
Android RxJava:细说 线程控制(切换 / 调度 )(含Retrofit实例讲解)
Android RxJava 实际应用讲解:网络请求出错重连(结合Retrofit)
android – java.lang.AssertionError:意外的节点Pythonid; nodes = [org.jetbrains.plugins.terminal,org.jetbrains.plugins.javaFX
除了以前我找不到任何有用的东西:https://code.google.com/p/android/issues/detail?id=164202
Android Studio要求我安装一些插件后问题出现了:
内部错误.请向https://code.google.com/p/android/issues报告
java.lang.AssertionError: Unexpected node Pythonid; nodes=[org.jetbrains.plugins.terminal,org.jetbrains.plugins.javaFX,org.jetbrains.plugins.gradle,org.jetbrains.plugins.github,org.jetbrains.java.decompiler,org.jetbrains.idea.maven,org.jetbrains.android,org.intellij.intelliLang,org.intellij.groovy,org.editorconfig.editorconfigjetbrains,hg4idea,com.millennialmedia.intellibot,com.jivesoftware.robot.intellij.plugin,com.intellij.ui-designer-new,com.intellij.tasks,com.intellij.properties,com.intellij.modules.xml,com.intellij.modules.xdebugger,com.intellij.modules.vcs,com.intellij.modules.python,com.intellij.modules.platform,com.intellij.modules.lang,com.intellij.modules.json,com.intellij.modules.java,com.intellij.modules.androidstudio,com.intellij.modules.all,com.intellij.java-i18n,com.intellij.copyright,com.intellij,com.google.gct.testing,com.google.gct.login,com.google.gct,amailp.intellij.robot,TestNG-J,Subversion,JUnit,Git4Idea,Coverage,CVS] at com.intellij.util.graph.GraphGenerator.buildOuts(GraphGenerator.java:55) at com.intellij.util.graph.GraphGenerator.<init>(GraphGenerator.java:36) at com.intellij.util.graph.GraphGenerator.create(GraphGenerator.java:40) at com.intellij.ide.plugins.PluginManagerCore.createPluginIdGraph(PluginManagerCore.java:543) at com.intellij.ide.plugins.PluginManagerCore.initializePlugins(PluginManagerCore.java:1126) at com.intellij.ide.plugins.PluginManagerCore.initPlugins(PluginManagerCore.java:1256) at com.intellij.openapi.application.impl.ApplicationImpl.loadApplicationComponents(ApplicationImpl.java:348) at com.intellij.openapi.application.impl.ApplicationImpl.<init>(ApplicationImpl.java:215) at com.intellij.openapi.application.ex.ApplicationManagerEx.createApplication(ApplicationManagerEx.java:45) at com.intellij.idea.IdeaApplication.<init>(IdeaApplication.java:112) at com.intellij.idea.MainImpl$1$1.run(MainImpl.java:47) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745) at java.awt.EventQueue.access$300(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:706) at java.awt.EventQueue$3.run(EventQueue.java:704) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:715) at java.awt.EventdispatchThread.pumpOneEventForFilters(EventdispatchThread.java:242) at java.awt.EventdispatchThread.pumpEventsForFilter(EventdispatchThread.java:161) at java.awt.EventdispatchThread.pumpEventsForHierarchy(EventdispatchThread.java:150) at java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:146) at java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:138) at java.awt.EventdispatchThread.run(EventdispatchThread.java:91)
解决方法
Linux(也很可能是Windows):
echo Pythonid>> 〜/.\u0026 LT; JetBrainsproduct> /config/disabled_plugins.txt
OS X:
echo Pythonid>> 〜/库/首/< JetBrainsproduct> /config/disabled_plugins.txt
答案很长:
我遇到了IntelliJ 15的一个熟悉的问题.虽然不一样,Android Studio基于IntelliJ,修复应该类似:
>找到应用程序的配置文件夹(对于〜/ .IntelliJIdea15 / config的IntelliJ15,Android Studio就像〜/ .AndroidStudio /(在Linux和Windows上,在OS X上查看〜/ Library / Preferences /< JetBrainsproduct> /)
>打开文件disabled_plugins.txt并添加像Pythonid一样的行
>再次启动IDE
这个问题的正式答案可以在这里找到:https://youtrack.jetbrains.com/issue/IDEA-147244(他们确实提供了不同的解决方案)
android-同一项目中的RxJava 1和RxJava 2
这个问题已经在这里有了答案: > How to resolve Duplicate files copied in APK META-INF/rxjava.properties 7个
我们的项目使用RxJava 1:
compile 'io.reactivex:rxjava:1.1.6'
我们使用一个内部使用RxJava 2的库:
compile 'io.reactivex.rxjava2:rxjava:2.0.9'
当我执行./gradlew assembleDebug时,出现以下错误:
com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK meta-inf/rxjava.properties
File1: /Users/darklord/.gradle/caches/modules-2/files-2.1/io.reactivex/rxjava/1.1.6/2586312cd2b8a511e4c6236736f5a039fc0f2273/rxjava-1.1.6.jar
File2: /Users/darklord/.gradle/caches/modules-2/files-2.1/io.reactivex.rxjava2/rxjava/2.0.9/a5aad74623ade11162dd53cdf0645a51b12221a0/rxjava-2.0.9.jar
我认为据说可以同时使用RxJava 1和RxJava 2,为什么我仍然收到此错误?
解决方法:
运行时不需要rxjava.properties文件.
因此,您可以在打包Android应用程序时排除该文件,方法是在app / build.gradle文件中设置PackagingOptions,如下所示.
android {
...
packagingOptions {
exclude 'meta-inf/**rxjava.properties**'
}
}
API 16上的RxJava noClassDefFoundError:rx.plugins.RxJavaPlugins
我正在使用RxJava和Retofit开发一个Android应用程序.当我在API 23上测试我的代码时,我没有得到任何错误,但是当我在API 15中测试时,我的RxJava似乎无法正常工作,我的应用程序崩溃并出现错误:
FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at $Proxy1.createtoken(Native Method)
at com.loginsignup.presenter.LoginPresenterImpl.tryToLogin(LoginPresenterImpl.java:39)
at com.loginsignup.view.LoginActivity.tryToLogin(LoginActivity.java:197)
at com.loginsignup.view.LoginActivity.onClick(LoginActivity.java:180)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: rx.plugins.RxJavaPlugins
at rx.Observable.<clinit>(Observable.java:63)
at $Proxy1.createtoken(Native Method)
at com.gooroo.gooroo.loginsignup.presenter.LoginPresenterImpl.tryToLogin(LoginPresenterImpl.java:39)
at com.gooroo.gooroo.loginsignup.view.LoginActivity.tryToLogin(LoginActivity.java:197)
at com.gooroo.gooroo.loginsignup.view.LoginActivity.onClick(LoginActivity.java:180)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
这是我的gradle构建:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsversion "23.0.2"
defaultConfig {
applicationId "com.example.ex"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "0.1 alpha"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
javaMaxHeapSize "4g"
}
}
dependencies {
compile filetree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
compile files('libs/sinch-android-rtc-3.9.5.jar')
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:cardview-v7:23.4.0'
compile 'com.google.android.gms:play-services-maps:8.4.0'
compile 'com.google.android.gms:play-services-location:8.4.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.google.android.gms:play-services-analytics:8.4.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.2.0'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'com.github.orhanobut:logger:1.12'
compile 'com.viewpagerindicator:library:2.4.1@aar'
compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'
compile 'com.facebook.android:facebook-android-sdk:4.+'
compile 'com.stripe:stripe-android:+'
compile 'com.google.android.gms:play-services-gcm:8.4.0'
compile 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
compile 'com.amazonaws:aws-android-sdk-core:2.+'
compile 'com.amazonaws:aws-android-sdk-s3:2.+'
compile 'com.google.android.gms:play-services-wallet:8.4.0'
compile 'com.android.support:multidex:1.0.0'
}
apply plugin: 'com.google.gms.google-services'
知道为什么在API 23上没有问题,但是当我在API 16上运行它时,当我尝试登录时使用RxJava会崩溃吗?
解决方法:
这里的问题可能是你没有初始化MultiDex Option
适用于Android 5.0及更高版本的Multidex支持
Android 5.0 and higher uses a runtime called ART which natively
supports loading multiple dex files from application APK files. ART
performs pre-compilation at application install time which scans for
classes(..N).dex files and compiles them into a single .oat file for
execution by the Android device. For more information on the Android
5.0 runtime, see Introducing ART.
This is the reason why your app is working fine on API level 21.
Android 5.0之前的Multidex支持
Versions of the platform prior to Android 5.0 use the Dalvik runtime
for executing app code. By default, Dalvik limits apps to a single
classes.dex bytecode file per APK. In order to get around this
limitation, you can use the multidex support library, which becomes
part of the primary DEX file of your app and then manages access to
the additional DEX files and the code they contain.
所以,首先要确保你已经导入了正确的依赖,这似乎你做到了.
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
在清单中,将Multidex支持库中的MultiDexApplication类添加到application元素中.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
// This will solved the problem
android:name="YourAppName">
...
</application>
</manifest>
这就是我如何解决我的问题,即使有相同的关闭Git问题.
编辑
public class YouAppName extends MultiDexApplication {
.. ..
}
我希望它会帮助你.
关于RxJava noClassDefFoundError:API 16上的rx.plugins.RxJavaPlugins和rxjava observable的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程、android – java.lang.AssertionError:意外的节点Pythonid; nodes = [org.jetbrains.plugins.terminal,org.jetbrains.plugins.javaFX、android-同一项目中的RxJava 1和RxJava 2、API 16上的RxJava noClassDefFoundError:rx.plugins.RxJavaPlugins等相关知识的信息别忘了在本站进行查找喔。
本文标签: