【问题标题】:android rxjava observable fromCallable onNext function not call after proguard activatedandroid rxjava observable fromCallable onNext 函数在proguard激活后不调用
【发布时间】:2016-10-28 08:44:52
【问题描述】:

编辑解决方案:如果您有相同的情况,请不要使用以下组合。

RxJava、Jack & Jill Java 8 支持和 Proguard

我从我的 gradle 文件中禁用了 Jack & Jill,并添加了用于 lambda 支持的复古 lambda 插件。问题解决了!

proguard-rules.pro 应该包含以下 RxJava 规则:

-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;
}

问题

我正在使用Observable's fromCallable 函数来生成测试数据。 没有 proguard 的代码运行良好,但是当我激活 proguard 时,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(() -&gt; EventProducer.produce(20)) 函数时,它正在工作。

【问题讨论】:

  • 嘿,我遇到了完全相同的问题。你找到解决办法了吗?
  • 是的,我为问题帖子的头部写了解决方案。 如果您使用 jack to java 8 功能,您也应该禁用它。如果需要 lambda 表达式,可以使用 retrolambda 插件

标签: android proguard rx-java observable


【解决方案1】:

嘿,RxJava 我使用这个规则

# 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 {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

也许会有所帮助。

干杯

【讨论】:

  • 我用您的 proguard 规则更改了我的规则,但它会产生错误并导致应用程序崩溃。 logcat 是:java.lang.InternalError at rx.e.a.b.b.b(:115) at rx.e.a.b.c.&lt;clinit&gt;(:34) at rx.e.a.m.d(:154) at rx.e.a.m.&lt;init&gt;(:58) at rx.e.a.m.&lt;init&gt;(:37) at rx.e.a.q.&lt;init&gt;(:264) at rx.e.a.aa.&lt;clinit&gt;(:264) at rx.a.g(:7334)
  • 尝试更新。顺便说一句,您不需要将 android sdk 类添加到 proguard
  • 之前的错误消失了,但还是一样。 onNext 函数没有被调用。
  • 我检查了,没有错误。真奇怪。我把每个 try catch 块打印错误消息和 subsription 的 onError 抛出消息。没有。
猜你喜欢
  • 2018-02-20
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多