2017-01-01 2 views
0

J'utilise BusProvider avec Android pour gérer les post-retours au thread principal après l'exécution d'un AsynTask. Lorsque la tâche asynchrone est terminée et qu'elle réussit, elle enregistre le message et revient au thread principal pour afficher une boîte de dialogue d'alerte. Quand cela échoue cependant, je voudrais qu'il retourne à la même méthode dans le thread MAIN et afficher un message expliquant pourquoi il a échoué. Dans ce cas, c'est l'inscription, donc cela pourrait être aussi simple que "Cet email est déjà utilisé".BusProvider ne pas retourner à @Subscribe

Cela ne semble pas fonctionner pour moi et il ne revient jamais à la discussion MAIN.

Dans ma tâche Async utilisant le BusProvider, je suis annonce de retour ce en cas d'échec:

@Override 
     public void failure(RetrofitError error) { 
      BusProvider.getInstance().post(new SignupTask.ErrorEvent(new String(((TypedByteArray) error.getResponse().getBody()).getBytes()))); 
     } 

Il est ensuite passé dans la ErrorEvent de classe:

public class ErrorEvent { 

    public String message; 

    public ErrorEvent(String message) { 
     this.message = ResponseParser(message); 
    } 

    public String ResponseParser(String response){ 
     //Handle JSON parsing here of response, need message + the array stack to display to the user what is exactly wrong 
     return response; 
    } 

} 

encore du travail à faire là-bas mais avant d'analyser l'information je voudrais juste passer la réponse pour le moment.

La réponse n'est PAS nulle et j'ai vérifié cela pendant le débogage. Une fois qu'il revient au poste (...) il ne retourne jamais au fil conducteur et a frappé mon @Subscribe

@Subscribe BusProvider.getInstance():.

@Subscribe 
public void onSignUpSuccess(SignupResponse event) { 
    loading.dismiss(); 

    if(!BuildConfig.DEBUG_MODE) { 
     Log.i(TAG, "!BuildConfig.DEBUG_MODE : " + AnswersAnalytics.SIGN_UP_PATIENT); 
     Answers.getInstance().logCustom(new CustomEvent(AnswersAnalytics.SIGN_UP)); 
    } 
    AlertDialog alertDialog = new AlertDialog.Builder(SignupActivity.this).create(); 
    alertDialog.setTitle("Thank you"); 
    alertDialog.setMessage(event.getMsg()); 
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        killSignup(); 
       } 
      }); 
    alertDialog.show(); 
} 

Je voudrais utiliser cette même @Subscribe pour gérer l'erreur et l'afficher.

Toute aide est grandement appréciée!

Répondre

1

Vous ne pouvez pas publier d'événement à partir d'un autre thread sur le thread UI. Vous pouvez utiliser Handler pour cela.

private Handler mHandler = new Handler(Looper.getMainLooper()) { 
    @Override 
    public void handleMessage(Message msg) { 
     synchronized (this) { 
      BusProvider.get().post(msg.obj); 
     } 
    } 
}; 

private void post(Object message) { 
    Message msg = mHandler.obtainMessage(0); 
    msg.obj = message; 
    mHandler.sendMessage(msg); 
} 

@Override 
public void failure(RetrofitError error) { 
    this.post(new SignupTask.ErrorEvent(new String(((TypedByteArray) error.getResponse().getBody()).getBytes()))); 
} 
+0

J'ai essayé ceci et je n'arrive toujours pas à la vue parente pour enlever le spinner.dismiss(). Son sur le thread principal dans l'activité parent de l'AsyncTask – Keeano

+0

Avez-vous essayé de déboguer la méthode 'Bus'.'post'? Il appelle simplement méthode souscrite par réflexion, aucune magie n'est là. Il suffit de vérifier comment ça se passe avec les classes otto dans les méthodes qui sont déjà utilisées dans votre projet et de les comparer à celles qui ne fonctionnent pas. ce n'est ni votre classe n'est pas enregistrée (ou enregistrée à partir d'un autre bus) ni vous l'appelez d'un autre thread. Vous pouvez également vérifier l'utilisation de la mémoire lors de l'empilage des gestionnaires 'post', si votre mémoire augmente, cela signifie que quelque chose ne va pas, si c'est sur le même lvl ou est effacé par' GC' vous avez juste raté l'enregistrement. – deathangel908

+0

la méthode de souscription actuelle fonctionne bien lorsque je reçois un succès du serveur, ne fonctionne pas sur un échec. Il ne fait même pas le point d'arrêt que j'ai placé dans la méthode d'abonnement – Keeano