[英]Checking if url exists
对于我的项目,我需要检查一个URL以查看它是否存在。 因此,我创建了一个HttpURLConnection
并连接到url,然后等待响应代码。 由于我无法在主线程中使用该HttpURLConnection,因此必须将其移至AsyncTask并使其在单独的线程上运行。
这是我的AsyncTask代码(仅重要部分):
private class URLExists extends AsyncTask<String, Void, Boolean> {
protected Boolean doInBackground(String... urls)
{
boolean isValid = false;
try
{
URL myurl = new URL(urls[0]);
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection connection = (HttpURLConnection) myurl.openConnection();
connection.setUseCaches(true);
connection.setRequestMethod("HEAD");
connection.connect();
int code = connection.getResponseCode();
...
connection.disconnect();
if(code != 404)
isValid = true;
else
isValid = false;
}
...
return isValid;
}
protected void onPostExecute(Boolean isValid)
{
isTrue = isValid;
}
}
所以基本上我然后得到一个布尔值isTrue
,它告诉我该URL是否有效。 当我运行此程序时,我得到正确的结果,一切正常。
但是现在,当我执行此AsyncTask时,它显然与我的主线程平行运行。
我有以下代码:
new URLExists().execute("https://www.example.com");
if(isTrue)
{
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Do Something
}
});
}
由于我的AsyncTask是并行运行的,因此我的主线程无需等待AsyncTask的结果即可执行下一个操作。 由于默认情况下isTrue
为false
,因此if语句永远不会运行。
当然,我知道AsyncTask中protected void onPostExecute()
,但这是否意味着我主线程中的所有代码都必须在并行线程的该函数中? 这完全取决于URL检查的结果。
我知道.get()方法,但这冻结了我的MainThread和UI,因此这对我来说不是一个选择。
还有其他方法可以让主线程等待AsyncTask吗? 我知道失败了AsyncTask的目的,但是我只想检查URL是否存在,并且我只能在AsyncTask中进行检查。
您不需要多线程来执行任务。 您所需要做的就是检查网址是否可用。 对? 当然,这可能需要一些时间,您必须在主线程中等待这个时间。 那就对了。 但是您仍然需要等待。 不要造成不必要的复杂性。 只需阅读url,获取响应代码,对其进行验证,检查超时异常,就可以了。
我们需要查看AsyncTask的规范。 通常,在任何异步方法中,都有一个回调函数,让您知道后台操作已完成。 如果是Android,则为onPostExecute()
在这里能找到它。 http://developer.android.com/reference/android/os/AsyncTask.html
当执行异步任务时,该任务将经历4个步骤:
onPreExecute()
,在执行任务之前在UI线程上调用。 此步骤通常用于设置任务,例如,通过在用户界面中显示进度栏。
doInBackground(Params...)
,在onPreExecute()完成执行后立即在后台线程上调用。 此步骤用于执行可能需要很长时间的后台计算。 异步任务的参数将传递到此步骤。 计算结果必须通过此步骤返回,并将传递回最后一步。 此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单位。 这些值在onProgressUpdate(Progress ...)步骤中发布在UI线程上。
onProgressUpdate(Progress...)
,在调用publishProgress(Progress ...)之后在UI线程上调用。 执行的时间是不确定的。 此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。 例如,它可用于为进度栏设置动画或在文本字段中显示日志。
onPostExecute(Result)
,在后台计算完成后在UI线程上调用。 后台计算的结果作为参数传递到此步骤。
对于您的特定情况,您可能想要执行以下操作。
yourAsyncTask{
@Override
protected Boolean doInBackground(Void... params){
// CHECK YOUR URL HERE
}
.
.
.
@Override
public void onPostExecute(Result result){
if(isTrue) {
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Do Something
}
});
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.