如果出现错误,ParseUser.signUpInBackground()会返回什么?

时间:2014-12-23 15:39:35

标签: android parse-platform bolts-framework

我正在尝试使用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不会返回任何错误?

1 个答案:

答案 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期间发生了一些错误,我会创建另一个用户登录的任务。