2016-10-28 2 views
1

EDIT SOLUTION: Не используйте следующую комбинацию, если у вас есть такая же ситуация.android rxjava наблюдаемый 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); 
     } 
    }; 
} 

getNearbyUserEvents EventImplementer в

@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 to java 8, вам также следует отключить **. вы можете использовать ** retrolambda plugin **, если вам нужны лямбда-выражения. – 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: 'java.lang.InternalError \t at rx.e.a.b.b.b (: 115) \t at rx.e.a.b.c. (: 34) \t по адресу: 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 на rx.a.g (: 7334) ' – okarakose

+0

попробуйте обновить. btw вам не нужно добавлять классы android sdk в proguard –

+0

предыдущая ошибка исчезла, но она по-прежнему такая же. Функция onNext не получает вызов. – okarakose

Смежные вопросы