2017-01-01 6 views
0

Я использую BusProvider с Android для обработки сообщений обратной связи в основной поток после выполнения AsynTask. Когда задача Async завершена и она успешна, она регистрирует сообщение и возвращается в поток MAIN для отображения диалогового окна предупреждения. Когда это не удается, я хотел бы, чтобы он вернулся к тому же методу в потоке MAIN и отобразил сообщение о том, почему он не удалось. В этом случае он регистрируется, поэтому это может быть так просто, как «Это письмо уже используется».BusProvider не возвращается к @Subscribe

Это, похоже, не работает для меня, и он никогда не возвращается к основной теме.

В моей задаче асинхронным с помощью BusProvider, я отправляю назад это на провал:

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

Затем перешел в класс ErrorEvent:

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; 
    } 

} 

Еще какую-то работу, чтобы сделать там но прежде чем разобрать информацию, которую я хотел бы просто передать ответ назад.

Ответ не равен нулю, и я проверил это при отладке. После того, как он возвращается к BusProvider.getInstance() пост (...) он никогда не возвращается в основной поток и ударил мой @Subscribe

@Subscribe:.

@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(); 
} 

Я хотел бы использовать это то же @Subscribe для обработки ошибки и отображения ее.

Любая помощь очень ценится!

ответ

1

Вы не можете публиковать сообщения из другого потока в пользовательский интерфейс. Вы можете использовать для этого Handler.

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

Я пробовал это, и я до сих пор не добираюсь до родительского вида, чтобы удалить spinner.dismiss(). Его по основному потоку в родительской активности от AsyncTask – Keeano

+0

Вы пытались отладить метод 'Bus'.post'? Он просто называет подписанный метод через отражение, никакой магии нет. Просто проверьте, как это происходит с помощью классов, которые уже работают в вашем проекте и сравнивают их с вашим текущим нерабочим. это не ваш класс, который не зарегистрирован (или зарегистрирован на другой шине), и вы не вызываете его из другого потока. Вы также можете проверить использование памяти во время стекирования обработчиков 'post', если ваша память идет вверх, это означает, что что-то не так, если оно находится на одном уровне lvl или очищается' GC', вы просто испортились с регистрацией. – deathangel908

+0

Текущий метод подписки работает отлично, когда я получаю успех с сервера, просто не работает при сбое. Он даже не доходит до точки останова, которую я разместил в методе подписки. – Keeano

 Смежные вопросы

  • Нет связанных вопросов^_^