2016-10-20 39 views
1

我現在面臨tasks,我有疑問。在電子郵件/通行證註冊後,我必須更新用戶的個人資料。所以我第一次嘗試這樣的:如何在給定的參數不同時正確地繼續任務

FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password); 
    .continueWithTask(new Continuation<AuthResult, Task<Void>>() { 
     @Override 
     public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception { 
      UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() 
       .setDisplayName(fullname) 
       .build(); 
      return t.getResult().getUser().updateProfile(profileUpdates); 
     } 
    }) 
    .addOnFailureListener(this, mOnSignInFailureListener) 
    .addOnSuccessListener(this, mOnSignInSuccessListener); // <- problem! 

的問題是在上線我監聽等待一個AuthResult參數,但updateProfile任務發送Void。我像波紋管一樣處理了這種情況,但看起來太亂了。告訴我,如果有另一種更好的方式來做到這一點:

final Task<AuthResult> mainTask; 
mainTask = FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password); 
mainTask 
    .continueWithTask(new Continuation<AuthResult, Task<Void>>() { 
     @Override 
     public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception { 
      UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() 
       .setDisplayName(fullname) 
       .build(); 
      return t.getResult().getUser().updateProfile(profileUpdates); 
     } 
    }) 
    .continueWithTask(new Continuation<Void, Task<AuthResult>>() { 
     @Override 
     public Task<AuthResult> then(@NonNull Task<Void> t) throws Exception { 
      return mainTask; 
     } 
    }) 
    .addOnFailureListener(this, mOnSignInFailureListener) 
    .addOnSuccessListener(this, mOnSignInSuccessListener); 

回答

1

它看起來像你期望得到直接傳遞到mOnSignInSuccessListener的AuthResult。在這種情況下,在我看來,試圖強制一個額外的Continuation返回你正在尋找的值是不值得的。

而不是嘗試安排將AuthResult作爲參數傳遞給該偵聽器,偵聽器可以直接直接進入mainTask.getResult(),或者可以將AuthResult保存到成員變量中並以此方式訪問它。無論哪種方式,它都是安全的,因爲mOnSignInSuccessListener只會在mainTask完成後調用,這確保了AuthResult已準備就緒。

相關問題