Android: AsyncTask и непрерывный файловый ввод-вывод - PullRequest
0 голосов
/ 26 июля 2011

Я пытаюсь использовать AsyncTask для чтения из файла через равные промежутки времени. В файле есть жестко разделенный разделитель типа «EOL» между каждым интервалом строк, которые я хочу прочитать. Моя текущая реализация включает в себя AsyncTask чтение первого интервала строк с использованием BufferedReader до тех пор, пока оно не достигнет маркера EOL, затем выполнит некоторое обновление пользовательского интерфейса с помощью publishProgress(), ожидает некоторый период времени и затем должно перейти к следующий интервал текста.

Мой вопрос заключается в следующем: как мне перейти к следующему интервалу текста при использовании AsyncTask? Кажется, я должен продолжать вызывать new() на BufferedReader для каждого интервала, что, в свою очередь, сбрасывает мою позицию в файле. Есть ли альтернативные библиотеки, которые я могу использовать? Обратите внимание, что мне нужно сохранить AsyncTask, так как я пытаюсь симулировать потоковые данные из живого источника каждые X секунд.

Я могу предоставить некоторый код при необходимости, но это в основном вопрос проектирования высокого уровня.

Ответы [ 3 ]

1 голос
/ 26 июля 2011

AsyncTask ориентирован на выполнение «целой» задачи, но не «частичной» задачи.Хотя можно заставить его действовать таким образом, это может быть не так просто.Я бы предложил использовать немного другой дизайн для более эффективного использования AsyncTask.Сохраните ваш BufferedReader как часть состояния вашего файла и передайте его AsyncTask, чтобы вычислить только разницу между последним чтением и следующим чтением.

1 голос
/ 26 июля 2011

В вашей реализации doynBackground AsynTask есть цикл, а затем в конце каждого цикла (когда вы достигаете EOL) вызываете Activity.runOnUiThread (Runnable) для обновления пользовательского интерфейса. Таким образом, вы никогда не оставляете do в фоновом режиме, и вам не нужно терять свою ссылку на вашу позицию.

Другой вариант - использовать обработчик .

1 голос
/ 26 июля 2011

Сохраните длинную переменную, в которой хранится количество ваших байтов, и используйте метод пропуска (long bytecount).

В качестве альтернативы можно создать подкласс AsyncTask и присвоить ему статический BufferedReader в качестве поля элемента

...