2017-01-01 34 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

相關問題