java - Android - 任务在应该运行时没有运行

标签 java android android-asynctask

我正在使用 Backendless 来存储我的应用程序用户的数据。 Backendless 只能选择使您的电子邮件或用户名唯一。我将我的用户名字段设置为唯一,这就是用户用于登录的字段。电子邮件可以重复使用,因此我在注册之前制定了一种方法来检查电子邮件是否存在。

这是 createUser 方法,它会启动并在启动后立即调用该方法来检查电子邮件可用性:

private void createUser() {
    showProgressDialog();

    if (isEmailAvailable(inputEmail.getText().toString().trim())) {
        BackendlessUser user = new BackendlessUser();
        user.setProperty(BackendSettings.USERNAME_KEY, inputUsername.getText().toString().trim());
        user.setEmail(inputEmail.getText().toString().trim());
        user.setPassword(inputPassword.getText().toString());

        Backendless.UserService.register(user, new AsyncCallback<BackendlessUser>() {
            @Override
            public void handleResponse(BackendlessUser backendlessUser) {
                hideProgressDialog();
                Toast.makeText(CreateAccountActivity.this, BackendSettings.REGISTER_SUCCESS_MESSAGE, Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(CreateAccountActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }

            @Override
            public void handleFault(BackendlessFault backendlessFault) {
                hideProgressDialog();
                String errorCode = backendlessFault.getCode();
                String errorMessage;
                switch (errorCode) {
                    case "3040":
                        errorMessage = BackendSettings.ERROR_3040;
                        break;
                    case "3033":
                        errorMessage = BackendSettings.ERROR_3033;
                        break;
                    default:
                        errorMessage = "An unknown error occurred. Try again.";
                }
                Toast.makeText(CreateAccountActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
            }
        });
    } else {
        hideProgressDialog();
        Toast.makeText(CreateAccountActivity.this, BackendSettings.ERROR_EMAIL_TAKEN, Toast.LENGTH_SHORT).show();
    }
}

这是检查电子邮件可用性的方法:

private boolean isAvailable;
private boolean isEmailAvailable(String email) {
    isAvailable = false;

    String whereClause = "email = '" + email + "'";
    BackendlessDataQuery dataQuery = new BackendlessDataQuery();
    dataQuery.setWhereClause(whereClause);
    Backendless.Persistence.of(BackendlessUser.class).find(dataQuery, new AsyncCallback<BackendlessCollection<BackendlessUser>>() {
        @Override
        public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) {
            isAvailable = userBackendlessCollection.getData().isEmpty();
        }

        @Override
        public void handleFault(BackendlessFault backendlessFault) {
            Toast.makeText(CreateAccountActivity.this, backendlessFault.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
    return isAvailable;
}

好的,所以我总是收到电子邮件已被占用的消息,即使它没有被占用。因此,我决定在 isEmailAvailblehandleResponse 方法中添加一条 Toast 消息。无论电子邮件是否可用,我都会将其打印出来。因此,我首先从 createUser 中的 else 子句收到消息,表示电子邮件已被占用,然后我从 isEmailAvailable 方法收到消息。看起来 isEmailAvailable 方法随后正在运行。我不确定它出了什么问题。

最佳答案

哇! 错误出现在 isEmailAvailable 方法中。

查找是否是异步方法。 它的工作原理是这样的:你调用它,它就会开始工作并在任何实际结果之前立即返回。 随后它会调用回调方法。所以,当你这样做时

    return isAvailable;

该行的 isAvailable 始终为 false,因为它仍未更改。

你应该做一些异步工作。 1. 调用 Backendless.Persistence.of(BackendlessUser.class).find(...) 2.等待答复。只有在

中你才会知道结果
   public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) {
       isAvailable = userBackendlessCollection.getData().isEmpty();
   }

3.之后完成剩下的工作

    isAvailable = userBackendlessCollection.getData().isEmpty();

创建一个方法doCreateUser,将你的“if”主体放入其中,并在isAvailable = userBackendlessCollection.getData().isEmpty();之后从handleResponse调用它

使用此代码:

    private void createUser() {
        showProgressDialog();
        checkEmailAvailable(inputEmail.getText().toString().trim());
    }

    private void checkEmailAvailable(String email) {
        String whereClause = "email = '" + email + "'";
        BackendlessDataQuery dataQuery = new BackendlessDataQuery();
        dataQuery.setWhereClause(whereClause);
        Backendless.Persistence.of(BackendlessUser.class).find(dataQuery, new AsyncCallback<BackendlessCollection<BackendlessUser>>() {
            @Override
            public void handleResponse(BackendlessCollection<BackendlessUser> userBackendlessCollection) {
                isAvailable = userBackendlessCollection.getData().isEmpty();
                if (isAvailable){
                    doCreateuser();
                } else {
                    hideProgressDialog();
                    Toast.makeText(CreateAccountActivity.this, BackendSettings.ERROR_EMAIL_TAKEN, Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void handleFault(BackendlessFault backendlessFault) {
                Toast.makeText(CreateAccountActivity.this, backendlessFault.getMessage(), Toast.LENGTH_SHORT).show();
                hideProgressDialog();
            }
        });
    }

    private void doCreateuser(){
        BackendlessUser user = new BackendlessUser();
        user.setProperty(BackendSettings.USERNAME_KEY, inputUsername.getText().toString().trim());
        user.setEmail(inputEmail.getText().toString().trim());
        user.setPassword(inputPassword.getText().toString());

        Backendless.UserService.register(user, new AsyncCallback<BackendlessUser>() {
            @Override
            public void handleResponse(BackendlessUser backendlessUser) {
                hideProgressDialog();
                Toast.makeText(CreateAccountActivity.this, BackendSettings.REGISTER_SUCCESS_MESSAGE, Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(CreateAccountActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }

            @Override
            public void handleFault(BackendlessFault backendlessFault) {
                hideProgressDialog();
                String errorCode = backendlessFault.getCode();
                String errorMessage;
                switch (errorCode) {
                    case "3040":
                        errorMessage = BackendSettings.ERROR_3040;
                        break;
                    case "3033":
                        errorMessage = BackendSettings.ERROR_3033;
                        break;
                    default:
                        errorMessage = "An unknown error occurred. Try again.";
                }
                Toast.makeText(CreateAccountActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
            }
        });
    }

关于java - Android - 任务在应该运行时没有运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38024161/

相关文章:

android - 在android中打开通知时页面不刷新

android - Android应用程序中的Http网络问题

java - 从 XML 文档获取节点

java - key 适配器不工作

Android:GCM SENDER_ID 是否应该保密?

android - 如何使 SeparatedListAdapter 的节标题在滚动时推送上一节?

android - 异步Android SQLite数据库的正确实现

android - 从 maps.googleapis.com 获取 JSON 数据时出错

java - 如何通过避免重复来缩短 Tic Tac Toe 代码

java - Hibernate批量插入oracle 10g