Пользовательский интерфейс зависания задач Assync

#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. Извините, это ошибка. Я набрал здесь неправильно. В любом случае спасибо.