Asynctask не завершил загрузку до следующего вызова метода - PullRequest
0 голосов
/ 21 мая 2018

У меня есть простой класс, который расширяет AsyncTask, где я получаю доступ к текстовому файлу в Интернете и извлекаю содержимое до String tmpString.Все это сделано в doInBackground().Сразу после вызова execute(); я вызываю метод моего собственного метода parseContent(); из другого класса, который извлекает подстроки из tmpString.

Теперь проблема, когда я запускаю этот код, я получаю tmpString = null, что означаетсодержимое с веб-сайта является нулевым, но я знаю, что содержимое извлекается путем проверки с помощью Log.d("--------INFO--------", inputLine);, который печатает строку за строкой из исходного файла.Я подозреваю, что загрузка происходит слишком медленно перед следующим вызовом метода.Все работает нормально, когда я отлаживаюсь, потому что загрузка успела завершиться.

Использование execute().get(); работает, но я прочитал, что это не оптимальное решение, тем более что оно блокирует поток.Позже я хотел бы добавить индикатор загрузки для загрузки, но объединение этого с get() не сработает ... очевидно.

Что я хотел бы сделать, это вызвать только следующий методесли загрузка завершена, как я могу добиться этого?

Код здесь:

public class AccessFile extends AsyncTask<Object, Void, String>{
    private String urlContent = "";
    @Override
    protected String doInBackground(Object[] params) {
        URL url= null;
        url= new URL((String) params[0]);

        BufferedReader in = null;
        try {
            assert url!= null;
            in = new BufferedReader(
                    new InputStreamReader(
                            url.openStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        String inputLine = null;
        inputLine = in.readLine();

        while (inputLine != null){
            Log.d("--------INFO--------", inputLine);
            urlContent += inputLine;
            inputLine = in.readLine();
        }
        in.close();
        return "";
    }
}

Я вызываю это с помощью:

AccessFile af = new AccessFile();
af.execute("Link here").get();

1 Ответ

0 голосов
/ 21 мая 2018

Можно попробовать

AccessFile af = new AccessFile()
{
     @Override
     protected void onPostExecute(String result) {
           super.onPostExecute(result);
           //code which should be executed after task completion
     }

}; 
af.execute("link);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...