CheckReportExists1()
всегда будет возвращать значение false
; и это потому, что он работает в потоке пользовательского интерфейса и не будет ждать, пока AsyncTask
не завершит свою фоновую работу. Таким образом, он всегда будет возвращать свое начальное присвоенное значение, равное false
. Чтобы решить эту проблему, вы можете создать интерфейс слушателя с методом обратного вызова, который принимает Boolean
, который указывает, существует файл или нет. И запускайте этот обратный вызов всякий раз, когда вы действительно убедитесь, что файл существует или нет после завершения фоновой работы.
Поэтому измените код с помощью:
Интерфейс слушателя:
interface OutputListener {
void checkFile(Boolean exists);
}
AsyncTask:
public class CheckReportExists extends AsyncTask<String, Void, Boolean>{
Boolean fileExists = false;
OutputListener listener;
public CheckReportExists() {
}
public void CheckReportExists1(String download_url, OutputListener outputListener){
execute(download_url);
listener = outputListener;
}
@Override
protected void onPreExecute() {
//display progress dialog.
}
@Override
protected Boolean doInBackground(String... params) {
try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(params[0]).openConnection();
con.setRequestMethod("HEAD");
int response = con.getResponseCode();
if(response == HttpURLConnection.HTTP_OK){
fileExists = true;
}
} catch(Exception e){
}
return fileExists;
}
@Override
protected void onPostExecute(Boolean result) {
if (listener != null)
listener.checkFile(result);
// dismiss progress dialog and update ui
//super.onPostExecute(result);
}
}
Использование AsyncTask:
CheckReportExists cre = new CheckReportExists();
cre.CheckReportExists1(download_url, new OutputListener() {
@Override
public void checkFile(Boolean exists) {
if(fileExists) {
builder.setPositiveButton("Download Report", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new DownloadTask(Results.this, download_url);
}
});
} else {
builder.setPositiveButton("Report not ready yet", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
}
}
});