2016-10-28 74 views
1

编辑解决方案:如果您有相同的情况,请不要使用以下组合。android rxjava observable fromCallable onNext函数在proguard激活后不会调用

RxJava,杰克&吉尔的Java 8支持和Proguard的

我从我的gradle这个文件禁用杰克&吉尔和加入复古拉姆达插件拉姆达支持。问题解决了 !

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(() -> EventProducer.produce(20))函数它正在工作。

+0

嘿,我得到了完全相同的问题。你找到了解决方案吗? –

+0

是的,我写了问题帖的解决方案。 **如果您使用的是jack 8功能,则应该禁用它。如果你需要lambda表达式,你可以使用** retrolambda插件**。 – okarakose

回答

0

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

也许会有所帮助。

欢呼

+0

我用你的proguard规则改变了我的规则,但它产生了错误和崩溃的应用程序。 logcat是:rx.e.a.b.b处的java.lang.InternalError \t(位于rx.e.a.b.b.b(:115) \t)。 (:34) \t at rx.e.a.m.d(:154) \t at rx.e.a.m. (:58) \t at rx.e.a.m. (:37) \t at rx.e.a.q.(:264) \t at rx.e.a.aa. (:264) \t at rx.a.g(:7334)' – okarakose

+0

尝试更新。顺便说一句,你不需要添加android sdk类到proguard –

+0

以前的错误消失了,但它仍然是相同的。 onNext功能不会接到呼叫。 – okarakose

相关问题