我怎样才能实现这一目标?我正在创建一个注册表单。在继续到另一个字段之前,我不想等待从我的数据库中完成数据检索。示例:我的第一个字段是学生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;
}
}
答案 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)的文档。