在从我的数据库中检索数据时实现Asynctask

时间:2017-02-25 00:39:39

标签: android multithreading android-asynctask httpurlconnection

我怎样才能实现这一目标?我正在创建一个注册表单。在继续到另一个字段之前,我不想等待从我的数据库中完成数据检索。示例:我的第一个字段是学生ID,现在在输入数据之后,如果已经使用HTTPUrlConnection,它将使用HTTPUrlConnection从数据库中进行检查。但有时特别是如果我使用免费的虚拟主机,它需要时间来完成,但有时我的应用程序没有响应。我想要的是在我填满其他领域时让它检查。

来自我的电子邮件验证的示例代码

 public boolean checkIfSameEmail(String data) {
    try {
        String accountURL =  DataClass.localAddress + "/android_php/account.php";
        URL url = new URL(accountURL);
        connection = (HttpURLConnection) url.openConnection();
        connection.connect();
        InputStream stream = connection.getInputStream();
        reader = new BufferedReader(new InputStreamReader(stream));
        StringBuffer buffer = new StringBuffer();
        String line = "";


        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }

        String finalJson = buffer.toString();

        JSONObject parentObject = new JSONObject(finalJson);
        JSONArray parentArray = parentObject.getJSONArray("users");

        for (int x = 0; x < parentArray.length(); x++) {
            JSONObject finalObject = parentArray.getJSONObject(x);

            if (finalObject.getString("email").equalsIgnoreCase(data)) {
                System.out.println("Here!!");
                return true;

            }

        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

然后

  edtEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            edtEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!edtEmail.hasFocus()) {
                        getData();
                        edtEmailET(sEmail);
                    }
                }
            });
        }
    });

我是否必须使用线程,asynctask或其他东西?我是初学者,所以我真的没有想法。我只是在从数据库插入数据时使用Asynctask,我刚从教程中学到了它,也许我会在这里使用onPreExecute()?

更新:

内部edtEmailET是:

    public boolean edtEmailET(String Email) {

    if (Email.replace(" ", "").isEmpty()) {
        tilEmail.setError("You can't leave this empty.");
        return true;
    } else if (!checkIfValidEmail(Email) == true) {
        tilEmail.setError("Invalid e - mail address");
        return true;
    } else if (checkIfSameEmail(Email) == true) {
        tilEmail.setError("E-mail already used.");
        return true;
    } else {
        tilEmail.setError(null);
        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

使用AsyncTask可以满足您的需求。 您可以使用以下结构:

class VerifyEmailTask extends AsyncTask<String, Void, Boolean> {
    // use doInBackground() to make network calls, the returned value is
    // sent to onPostExecute()
    @Override
    protected Boolean doInBackground(String... data) {
        return checkIfSameEmail(data[0]);
    }

    // use onPostExecute() to perform any desired operation on the UI
    // with the result from your network call
    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            // do something
            Log.d("VerifyEmailTask", "Here!!");
        } else {
            // do something else
        }
    }
}

并称之为:

new VerifyEmailTask().execute("email@domain.com");

您应该阅读AsyncTask(https://developer.android.com/reference/android/os/AsyncTask.html)的文档。