1
votes

Afficher AlertDialog dans une vue après avoir observé un complétable

Je souhaite afficher un AlertDialog dans ma View indiquant que le résultat a réussi,

@Override
public void updateProfile() {
    Disposable d = updateInfoInteractor
            .build(new ProfileUpdateInfoInteractor.Param(view.getPhone(), view.getLocation(), view.getDescription()))
            .observeOn(schedulers.main())
            .subscribeWith(new DisposableCompletableObserver() {
                @Override
                public void onComplete() {
                    Timber.d("Profile edited");
                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("Error at edit profile");
                }
            });
}

après mon Completable effectué surComplete sur mon présentateur:

private void actionUpdateProfesional() {
    btnSave.setOnClickListener(view -> {
        alertDialog = new AlertDialog.Builder(this)
                .setTitle("Wait!")
                .setMessage("Are you sure you want update your data?")
                .setPositiveButton("YES", (dialogInterface, i) -> presenter.updateProfile())
                .setNegativeButton("NO", null)
                .create();
        alertDialog.show();
    });
}


0 commentaires

3 Réponses :


0
votes

Vous n'avez pas posé de question, je suppose donc que vous vous demandez comment afficher votre boîte de dialogue d'alerte sur un événement complet. Vous pouvez le faire en l'instanciant simplement à nouveau dans la fonction onComplete () .

@Override
public void updateProfile() {
    Disposable d = updateInfoInteractor
            .build(new ProfileUpdateInfoInteractor.Param(view.getPhone(), view.getLocation(), view.getDescription()))
            .observeOn(schedulers.main())
            .subscribeWith(new DisposableCompletableObserver() {
                @Override
                public void onComplete() {
                    Timber.d("Profile edited");

                    // Show alert dialog here!
                    alertDialog = new AlertDialog.Builder(this)
                        .setTitle("Wait!")
                        .setMessage("Are you sure you want update your data?")
                        .setPositiveButton("YES", (dialogInterface, i) -> 
                            presenter.updateProfile())
                        .setNegativeButton("NO", null)
                        .create();
                    alertDialog.show();
                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("Error at edit profile");
                }
            });
}

J'espère que cela vous aidera!


0 commentaires

1
votes

Vous devez appeler la méthode actionUpdateProfesional () de votre vue à partir de la méthode onComplete .

Vous devrez probablement ajouter la méthode actionUpdateProfesional () à votre interface View que vous référencez dans votre présentateur.

Ce serait quelque chose comme ceci:

@Override
public void updateProfile() {
    Disposable d = updateInfoInteractor
            .build(new ProfileUpdateInfoInteractor.Param(view.getPhone(), view.getLocation(), view.getDescription()))
            .observeOn(schedulers.main())
            .subscribeWith(new DisposableCompletableObserver() {
                @Override
                public void onComplete() {
                    Timber.d("Profile edited");
                    if (view != null) {
                        view.actionUpdateProfesional()
                    }
                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("Error at edit profile");
                }
            });
}


0 commentaires

1
votes

Mais si vous voulez résoudre ce problème par MVP Architecture, vous devez créer une nouvelle méthode dans votre interface View. Parce que le présentateur ne fait pas de logique d'interface utilisateur ou votre architecture sera cassée.

public class MainActivity extend AppCompatActivity implement MyObjectView{

…….

@Override
Public void resultSuccess(int code){

// call your dialog here

}

…..

}

Ensuite, n'oubliez pas d'implémenter votre interface View dans votre activité (UI). puis appelez votre alertDialog.

public interface MyObjectView {
    void resultSuccess(int status);
}


MyObjectView myView

Public MyPresenterConstructor(MyObjectView myView){
    this.myView = myView;
}


@Override
    public void updateProfile() {
        Disposable d = updateInfoInteractor
                .build(new ProfileUpdateInfoInteractor.Param(view.getPhone(), view.getLocation(), view.getDescription()))
                .observeOn(schedulers.main())
                .subscribeWith(new DisposableCompletableObserver() {
                    @Override
                    public void onComplete() {
                        Timber.d("Profile edited");

                        // Show alert dialog here!
            myView.resultSuccess(200)   // Okee

                    }

                    @Override
                    public void onError(Throwable e) {
                        Timber.d("Error at edit profile");
                    }
                });
    }


8 commentaires

Vous devez toujours vérifier si l'implémentation de la vue est nulle. Si l'activité est terminée et que le travail asynchrone n'a pas été supprimé, il peut se bloquer.


@ JaimeSuárez et où dois-je disposer mon jetable?


Vous devez le supprimer lorsque votre activité est détruite, dans la méthode onDestroy . Avant d'appeler le super.onDestroy () .


@ JaimeSuárez donc dans mon activité méthode onDestroy je devrais faire quelque chose comme ceci: presenter.killDispos () - ce sera une méthode qui me fera un droit jetable.dispos () ? (Parce que le bon appel est-il une méthode actuelle à partir de la vue? Cela devrait être le contraire)


et pourquoi devrait être avant le super ()?


Oui c'est correct. C'est une bonne pratique de faire votre travail (dans les méthodes destroyers d'une activité) avant que le système ne détruise les données dont vous dépendez.


Vous pouvez approfondir le sujet ici stackoverflow.com/questions/18821481/...


À propos du présentateur, essayez de garder l'activité indépendante de ce que fait le présentateur. Je nommerais la méthode du présentateur onScreenFinished ou quelque chose de similaire. Le présentateur doit seulement savoir qu'il y a eu un événement dans lequel il a besoin de libérer des ressources.