Je crée une petite application en utilisant Mosby.Android Mosby MVI lié au service dans le présentateur
L'application dispose d'un service auquel je souhaite me lier. Je suppose que le bon endroit pour le faire est dans le présentateur. Mais je ne peux pas vraiment comprendre comment le faire. Ce que je veux archiver, c'est quand le service est lié, je veux appeler une méthode dessus et pousser cette valeur à la vue, de sorte que l'état est correct maintenant. Lorsque le service envoie des mises à jour sur le bus d'événements, je souhaite également le transmettre à la vue.
J'ai trouvé un exemple sur la partie suivante, mais rien sur la façon de lier/dissocier le service dans le présentateur.
Mon coup de couteau sur elle était de créer quelque chose comme ça dans l'activité:
@NonNull
@Override
public MyPresenter createPresenter() {
return new MyPresenter(new MyService.ServiceHandler() {
@Override
public void start(ServiceConnection connection) {
Intent intent = new Intent(MyActivity.this, MyService.class);
startService(intent);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
@Override
public void stop(ServiceConnection connection) {
unbindService(connection);
}
});
Et puis dans le présentateur faire quelque chose comme ceci:
private ServiceConnection connection;
private boolean bound;
private MyService service;
public MyPresenter(MyService.ServiceHandler serviceHandler) {
super(new MyViewState.NotInitialiezedYet());
this.serviceHandler = serviceHandler;
connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService.LocalBinder binder = (MyService.LocalBinder) service;
service = binder.getService();
bool isInitialized = service.isInitialized();
// how do i push isInitialized to view?
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
}
@Override
public void attachView(@NonNull SplashView view) {
super.attachView(view);
serviceHandler.start(connection);
bound = true;
}
@Override
public void detachView(boolean retainInstance) {
super.detachView(retainInstance);
if(bound) {
serviceHandler.stop(connection);
bound = false;
}
}
@Override
protected void bindIntents() {
//Not sure what this would look like?
}
public void onEventInitialized(InitializedEvent event) {
//how do I push this to the view?
}
Suis-je sur le bon chemin? Quelle serait la bonne façon de faire cela? Comment est-ce que je devrais envoyer la valeur du service à la vue dans onServiceConnected et quand j'obtiens des événements sur le bus d'événement dans onEventInitialized?
Un grand merci pour la réponse rapide. Merci également pour tous les articles du blog! Je vais essayer ça. –
Ok, j'ai essayé d'envelopper ma tête mais je ne comprends pas. J'ai un service d'arrière-plan qui diffuse de l'audio. Je dois être en mesure d'appeler à côté, jouer, faire une pause sur le service via bind. du service je reçois des événements comme la prochaine piste, le progrès etc. À l'heure actuelle il y a un eventbus entre l'activité et le service. Vaut-il mieux obtenir un observable du service? À quoi ressemblerait un Interactor? Vous pouvez envoyer un événement de piste suivant à partir de l'interface utilisateur qui est envoyée au serveur et vous obtenez également un nouveau modèle de piste. Je suis nouveau sur Rx, donc il y a beaucoup de choses nouvelles. –
Ensuite, le seul besoin d'un service est que vous souhaitiez que le lecteur audio fonctionne en arrière-plan. Créez une classe 'AudioPlayer' avec une méthode' Observable getStateObservable() '(retourne l'état actuel du lecteur comme PLAYING XY ou PAUSED). Votre 'AudioPlayerInteractor' utilisé par' Presenter' s'abonne à cet état pour l'afficher dans la vue. Votre 'Service' partage la même instance' AudioPlayer' que 'AudioPlayerInteractor' mais contrôle juste le joueur comme si vous appeliez' audioPlayer.pause() '. Le service n'a pas à être lié, il suffit d'utiliser Android Intents pour communiquer avec 'Service'. –
sockeqwe