2017-01-01 44 views
0

我在Android上使用BusProvider来执行AsynTask后处理主线程的后发邮件。当异步任务完成并且成功时,它注册帖子并返回到主线程以显示警报对话框。当它失败时,我希望它返回到MAIN线程中的相同方法并显示一条消息,告诉它为什么失败。在这种情况下,它正在注册,所以它可以像“此电子邮件已被使用”一样简单。总线提供程序不返回到@订阅

这似乎并没有为我工作,它永远不会回到主线程。

在我的异步任务使用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(); 
} 

我想用这相同@订阅处理错误并显示它。

任何帮助非常感谢!

回答

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

我已经尝试过这一点,我仍然没有去父视图删除spinner.dismiss()。它在AsyncTask的父活动中的主线程上 – Keeano

+0

您尝试调试'Bus'.'post'方法吗?它只是通过反射调用订阅方法,没有魔法。只需检查它是如何通过类中已经在您的项目中工作的类,并将它们与您当前的非工作类进行比较。它既不是你的班级没有注册(或从另一个班车注册),也不是你从另一个线程调用它。你也可以在堆栈'post'处理程序时检查内存的使用情况,如果你的内存增加了,那就意味着有什么不对,如果它与lvl相同,或者被'GC'清除,你只是注册了。 – deathangel908

+0

当我从服务器获得成功时,当前的订阅方法正常工作,只是没有在失败中工作。它甚至不会让它进入我订购方法 – Keeano