У меня есть простой класс, который расширяет 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();