EDIT解決策:同じ状況の場合、次の組み合わせは使用しないでください。android rxjava observable fromCallable onNext関数はproguardの起動後に呼び出されません
RxJava、ジャック&ジルのJava 8のサポートとProGuardの
私は自分のGradleファイルからジャック&ジルを無効にし、ラムダのサポートのためのレトロなラムダプラグインを追加しました。問題が解決しました !私は、テストデータを生成するためにObservable's fromCallable
機能を使用してい
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
QUESTION
:
proguard-rules.proはRxJavaルールに以下が含まれていなければなりません。コードは正常に動作しますプロガードなししかし、私はアクティブプロガード、Subscription's onNext
関数を呼び出しません。
観察可能なコール
public void loadNearbyUserEvents() {
Log.w(TAG, "loadNearbyUserEvents");
try {
getMvpView().showProgress();
Subscription subscription = dataManager.getEventImplementer().getNearbyUsersEvents()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(getSubscriber());
subscriptions.add(subscription);
Log.w(TAG, "aaaa");
} catch (Exception e) {
e.printStackTrace();
getMvpView().showError(e.getMessage());
getMvpView().hideProgress();
}
}
private Subscriber<List<Event>> getSubscriber() {
return new Subscriber<List<Event>>() {
@Override
public void onCompleted() {
Log.w(TAG, "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.w(TAG, "onError");
e.printStackTrace();
}
@Override
public void onNext(List<Event> events) {
Log.w(TAG, "size of list : " + events.size());
getMvpView().hideProgress();
if (events.size() == 0) {
getMvpView().showEmpty();
return;
}
getMvpView().showEvents(events);
}
};
}
EventImplementerのgetNearbyUserEvents
@Override
public Observable<List<Event>> getNearbyUsersEvents() {
return Observable.fromCallable(() -> EventProducer.produce(20));
}
ProGuardのせずにうまく機能し、この上記のコード。私のコードと間違っているものを
proguard-rules.pro
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\developer\Android\Application\windows\android-sdk-windows/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# okhttp rulez
-dontwarn okio.**
# okhttp rulezzz
# retrofit rulez
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on RoboVM on iOS. Will not be used at runtime.
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions
# retrofit rulezzz
# searchView rulez
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.app.** { *; }
-keep interface android.support.v7.app.** { *; }
-keep class android.support.v7.widget.SearchView { *; }
-keep public class * extends android.support.v7.widget.SearchView {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
}
# searchview rulezzz
# parcel rulez
-keep interface org.parceler.Parcel
-keep @org.parceler.Parcel class * { *; }
-keep class **$$Parcelable { *; }
# parcel rulezzz
# picasso rulez
-dontwarn com.squareup.okhttp.**
# picasso rulezzz
# rx rulez
# rxjava
-keep class rx.schedulers.Schedulers {
public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
public <methods>;
}
-keep class rx.schedulers.TestScheduler {
public <methods>;
}
-keep class rx.schedulers.Schedulers {
public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
long producerNode;
long consumerNode;
}
# rx rulezzz
?なぜonCompleted関数は動作するのですか?onNext関数とonError関数は呼び出しません。
注:Observable.just(() -> EventProducer.produce(20))
機能を使用すると機能しています。
ちょっと私はまったく同じ問題を抱えています。あなたは解決策を見つけましたか? –
はい、私は質問の投稿の頭に解決策を書いた。 ** java 8の機能を使用する場合は、それも無効にする必要があります**。ラムダ式が必要な場合は、** retrolambda plugin **を使用することができます。 – okarakose