2016-10-28 1 views
1

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))機能を使用すると機能しています。

+0

ちょっと私はまったく同じ問題を抱えています。あなたは解決策を見つけましたか? –

+0

はい、私は質問の投稿の頭に解決策を書いた。 ** 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

あなたのルールを変更しましたが、エラーとクラッシュするアプリケーションが発生しています。 logcatは:java.lang.InternalError \t at rx.e.a.b.b.b(:115) \t rx.e.a.b.c (:34) \t rx.e.a.m.d(:154) \t rx.e.a.m。 (:58) \t rx.e.a.m. (:37) \t rx.e.a.q.(:264) \t at rx.e.a.aa. (:264) \t rx.a.g(:7334) ' – okarakose

+0

try update。 btwあなたはproguard –

+0

に以前のエラーがなくなっても、それは同じですアンドロイドSDKクラスを追加する必要はありません。 onNext関数は呼び出しを取得しません。 – okarakose

関連する問題