2017-02-07 1 views
1

dépendance Ajouté à GradleExtrayez Contexte Inscription RxBroadcast.fromBroadcast

compile 'com.cantrowitz:rxbroadcast:1.0.0' 

En utilisant RxBroadcast service intérieur

RxBroadcast.fromBroadcast(this, someFilter) 
      .subscribe(new Action1<Intent>() { 
         @Override 
         public void call(Intent intent) { 
          //NOTICE : only intent is received. no Context 
         } 
        }); 

regardé à l'intérieur du code source BroadcastProvider.createBroadcastReceiver méthode

@NonNull 
private BroadcastReceiver createBroadcastReceiver(
     final Subscriber<? super Intent> subscriber) { 
    return new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (!subscriber.isUnsubscribed()) { 
       //NOTICE : context is discarded here. 
       subscriber.onNext(intent); 
      } 
     } 
    }; 
} 

Comment puis-je récupérer Context à l'intérieur fromBroadcast abonnement?

+0

Peu de temps - vous ne pouvez pas, car seulement 'intention' est en cours d'émission. Bien sûr, à moins que vous ne changiez de sources et n'émettiez un objet wrapper avec l'intention et le contexte. – azizbekian

+0

@azizbekian merci. J'essaie d'appeler 'getSystemService' dans l'abonnement, y a-t-il une solution de contournement? – tchelidze

Répondre

0

Peu de temps - vous ne pouvez pas, car seulement intent est émis. Bien sûr, à moins que vous ne changiez de sources et n'émettiez un objet wrapper avec l'intention et le contexte.

Vous pouvez obtenir le contexte d'application globale, et après cela, vous pouvez effectuer getSystemService avec ce contexte.

Qu'est-ce que vous avez à faire est d'ajouter votre commande Application sous-classe dans AndroidManifest.xml

<application 
    android:name="com.your.package.MyApplication" 
    ... 
    > 

Et créer la classe MyApplication elle-même, qui hérite de android.app.Application

public class MyApplication extends Application { 
    static MyApplication application; 

    @Override 
    public void onCreate() { 
     application = this; 
    } 

    public static MyApplication getApplication() { 
     return application; 
    } 
} 

Maintenant, vous pouvez appeler MyApplication.getApplication().getSystemService() à partir de votre abonnement.

Il n'y a qu'une seule instance Application pendant le cycle de vie de l'application, donc aucune fuite ne peut se produire à cause de la référence statique.