我使用AsyncTask下载文件。但是当它下载文件时,UI会被冻结,我必须等待文件完成下载以便能够执行某些操作。我查看了其他线程,但我发现了使用.get()
运行任务等问题。
这就是我如何调用AsyncTask
new DownloadFileFromUrl().execute("url");
这里是AsyncTask
class DownloadFileFromURL extends AsyncTask<String, Integer, LineData> {
String fileDir = getApplicationContext().getFilesDir() + "/data.txt";
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected LineData doInBackground(String... f_url) {
int count;
//Download file--------------------------
try {
URL url = new URL(f_url[0]);
URLConnection conection = url.openConnection();
conection.connect();
int lenghtOfFile = conection.getContentLength();
InputStream input = new BufferedInputStream(url.openStream(),
8192);
OutputStream output = new FileOutputStream(fileDir);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) total * 100 / lenghtOfFile);
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(LineData data) {
setDataFor24Hours();
setDataFor48Hours();
setDataFor72Hours();
showDataFor24Hours();
setList();
Log.e("Downloader: ", "done!");
}
}
我已经将它Done!
发送到监视器,此时UI也会解冻,因此问题出在AsyncTask中。
我希望有人能帮助我。提前谢谢!
答案 0 :(得分:1)
AsyncTask设计使我们可以在不冻结UI的情况下执行操作。
但doInBackground
仅在后台运行。但是onPostExecute
在UI线程上运行。所以也许你的问题在onPostExecute
答案 1 :(得分:0)
尝试这样定义。
new DownloadFileFromUrl().execute("url");