BusProvider 不返回@Subscribe
BusProvider Not Returning to @Subscribe
我在 Android 上使用 BusProvider 来处理 post 在执行 AsynTask 后回到主线程。当异步任务完成并成功时,它会将 Post 和 return 注册到主线程以显示警报对话框。但是,当它失败时,我希望它 return 到 MAIN 线程中的相同方法,并显示一条消息,说明它失败的原因。在这种情况下,它正在注册,所以它可以像 "This email is already being used".
一样简单
这似乎对我不起作用,而且它永远不会回到主线程。
在我使用 BusProvider 的异步任务中,我 post 在失败时返回:
@Override
public void failure(RetrofitError error) {
BusProvider.getInstance().post(new SignupTask.ErrorEvent(new String(((TypedByteArray) error.getResponse().getBody()).getBytes())));
}
然后传递到 class 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(...) 它永远不会 returns 到主线程并点击我的@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 来处理错误并显示它。
非常感谢任何帮助!
您不能 post 从另一个线程到 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())));
}
我在 Android 上使用 BusProvider 来处理 post 在执行 AsynTask 后回到主线程。当异步任务完成并成功时,它会将 Post 和 return 注册到主线程以显示警报对话框。但是,当它失败时,我希望它 return 到 MAIN 线程中的相同方法,并显示一条消息,说明它失败的原因。在这种情况下,它正在注册,所以它可以像 "This email is already being used".
一样简单这似乎对我不起作用,而且它永远不会回到主线程。
在我使用 BusProvider 的异步任务中,我 post 在失败时返回:
@Override
public void failure(RetrofitError error) {
BusProvider.getInstance().post(new SignupTask.ErrorEvent(new String(((TypedByteArray) error.getResponse().getBody()).getBytes())));
}
然后传递到 class 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(...) 它永远不会 returns 到主线程并点击我的@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 来处理错误并显示它。
非常感谢任何帮助!
您不能 post 从另一个线程到 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())));
}