我正在尝试使用 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 callback) 并根据回调生成新任务,但它是一个有点丑陋的解决方案。那么,问题是为什么 signUpInBackground 不返回任何错误?