我正在尝试使用Parse SDK和Bolts框架实现我的注册流程。 使用Bolts-android文档,我创建了一个任务,尝试从社交网络获取个人信息,然后使用这些数据创建新的ParseUser并返回Task。我使用 onSuccessTask()方法将此任务链接到另一个,我尝试使用 signUpInBackground()方法向Parse注册新用户,该方法返回另一个任务。我用onSuccess()方法调用链接后者,在那里我检查注册是否成功完成,然后将用户转到另一个屏幕。 当新用户尝试注册一切正常时 - 用户成功注册。问题是当用户已经存在于服务器上时,Parse应该返回ParseException,代码为202,我认为我的第二个任务,我尝试注册的任务应该产生具有错误状态的新任务,但似乎它永远不会完成。
这是我的第一个任务:
private Task<ParseUser> fetchUserTask() {
final Task.TaskCompletionSource tcs = Task.create();
mNetwork.requestDetailedCurrentPerson(new OnRequestDetailedSocialPersonCompleteListener() {
@Override
public void onRequestDetailedSocialPersonSuccess(int socialNetworkID, SocialPerson socialPerson) {
ParseUser user = new ParseUser();
if (mNetworkId == VkSocialNetwork.ID) {
user.setUsername("vk" + socialPerson.id);
} else if (mNetworkId == FacebookSocialNetwork.ID) {
user.setUsername("fb" + socialPerson.id);
}
user.put("fullName", socialPerson.name);
user.put("photo", socialPerson.avatarURL);
tcs.setResult(user);
}
@Override
public void onError(int socialNetworkID, String requestID, String errorMessage, Object data) {
tcs.setError(new Exception(errorMessage));
}
});
return tcs.getTask();
}
这是我的登录方式:
private void loginUser() {
fetchUserTask()
.onSuccessTask(new Continuation<ParseUser, Task<Void>>() {
@Override
public Task<Void> then(Task<ParseUser> task) throws Exception {
if (task.isCompleted()) {
Log.d(EristicaConstants.LOG_TAG, "task1 ended");
return task.getResult().signUpInBackground();
} else {
Log.d(EristicaConstants.LOG_TAG, "some error happened " + task
.getError().getLocalizedMessage());
}
return null;
}
})
.onSuccess(new Continuation<Void, Void>() {
@Override
public Void then(Task<Void> task) throws Exception {
if (task.isCompleted()) {
Log.d(EristicaConstants.LOG_TAG, "task 2 ended");
mSuccessCallback.success();
} else {
Log.d(EristicaConstants.LOG_TAG, "some error happened 2" + task
.getError().getLocalizedMessage());
}
return null;
}
});
}
所以在新用户的情况下,我会看到这些日志序列:
Task 1 ended
Task 2 ended
但是对于现有用户,我只看到第一行,因此 onSuccess()从未调用过。当然我可以使用ParseUser.signUpInBackground(SignUpCallback回调)并根据回调产生新的Task,但它有点丑陋的解决方案。 那么,问题是为什么signUpInBackground不会返回任何错误?
答案 0 :(得分:0)
最后我得到了这个任务链:
private void loginUser() {
fetchUserTask()
.onSuccessTask(new Continuation<ParseUser, Task<Void>>() {
@Override
public Task<Void> then(Task<ParseUser> task) throws Exception {
if (task.isCompleted()) {
return task.getResult().signUpInBackground();
}
return null;
}
})
.continueWithTask(new Continuation<Void, Task<ParseUser>>() {
@Override
public Task<ParseUser> then(Task<Void> task) throws Exception {
if (task.isFaulted()) {
return ParseUser.logInInBackground(mUserId, PASSWORD);
}
return null;
}
})
.continueWith(new Continuation<ParseUser, Object>() {
@Override
public Object then(Task<ParseUser> task) throws Exception {
if (task.isCompleted()) {
mSuccessCallback.success();
}
return null;
}
});
}
如果在第二个任务中执行signUp期间发生了一些错误,我会创建另一个用户登录的任务。