#java #android #android-asynctask
#java #Android #android-asynctask
Вопрос:
Я использую AsyncTask для загрузки файла. Но пока он загружает файл, пользовательский интерфейс зависает, и мне нужно дождаться завершения загрузки файла, чтобы иметь возможность что-то сделать. Я просмотрел другие потоки, но обнаружил только такие проблемы, как запуск задачи с помощью .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!
на монитор, когда он завершится, и в этот момент пользовательский интерфейс также размораживается, поэтому проблема заключается в AsyncTask.
Я надеюсь, что кто-нибудь может мне помочь. Заранее спасибо!
Комментарии:
1. Означает ли замороженный пользовательский интерфейс, что он не принимает клики пользователя?
2. Длительные операции на самом деле не должны использовать AsyncTask по нескольким причинам, таким как его зависимость от активности хостинга или фрагмента. Вам следует попробовать службу, которая работает в фоновом режиме и не зависит от действия или фрагмента
3. Ваш тип результата определен
LineData
как, но почему вы возвращаетесьnull
doInBackground()
?
Ответ №1:
Дизайн AsyncTask таким образом, чтобы мы могли выполнять действие без замораживания пользовательского интерфейса. Но doInBackground
выполняется только в фоновом режиме. Но onPostExecute
выполняется в потоке пользовательского интерфейса. Так что, возможно, ваша проблема в onPostExecute
Комментарии:
1. Перемещен
Done!
в конец функции загрузки. Вы правы. Проблема вonPostExecute()
. Спасибо
Ответ №2:
Попробуйте определить так.
new DownloadFileFromUrl().execute("url");
Комментарии:
1. Извините, это ошибка. Я набрал здесь неправильно. В любом случае спасибо.