BusProvider没有返回@Subscribe

时间:2017-01-01 21:20:14

标签: java android multithreading android-asynctask otto

我在Android上使用BusProvider在执行AsynTask后处理主线程的回发。当Async任务完成并且成功时,它会注册Post并返回MAIN线程以显示警告对话框。当它失败时,我希望它返回到MAIN线程中的相同方法并显示一个消息,说明它失败的原因。在这种情况下,它正在注册,因此它可以像&#34一样简单;此电子邮件已被使用"。

这似乎对我有用,它永远不会回到主线程。

在使用BusProvider的Async任务中,我在失败时回复此信息:

 @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()。post(...)它就永远不会返回MAIN线程并点击我的@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 个答案:

答案 0 :(得分:1)

您无法将事件从其他线程发布到UI线程。您可以使用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())));
}