@KOS_MOS

Java/Android — взаимодействие со сторонним классом — вопрос от новичка?

Практикуюсь в программировании на Java для Android.

Встал вопрос, который не могу корректно решить и хочу услышать ваш совет.


Пример упрощен, но суть следующая — пишу программу для Android, которая получает список ссылок с сервера и скачивает их на телефон, вот два класса, которые используются для загрузки:

<font color="black"><font color="#0000ff">public</font> <font color="#0000ff">class</font> Download {<br/>
<br/>
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">long</font> getTotal() {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> total;<br/>
&nbsp;&nbsp;}<br/>
<br/>
&nbsp;&nbsp;<font color="#0000ff">protected</font> <font color="#0000ff">void</font> setTotal(<font color="#0000ff">long</font> total) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">this</font>.total = total;<br/>
&nbsp;&nbsp;}<br/>
<br/>
&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">long</font> total = 0;<br/>
<br/>
&nbsp;&nbsp;<font color="#0000ff">public</font> boolean download(String link, String path) throws IOException {<br/>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">// download the file</font><br/>
&nbsp;&nbsp;&nbsp;&nbsp;InputStream input = <font color="#0000ff">new</font> BufferedInputStream(url.openStream());<br/>
&nbsp;&nbsp;&nbsp;&nbsp;OutputStream output = <font color="#0000ff">new</font> FileOutputStream(outputFile);<br/>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">int</font> count = 0;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">byte</font> data[] = <font color="#0000ff">new</font> <font color="#0000ff">byte</font>[1024];<br/>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">while</font> ((count = input.read(data)) != -1) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">this</font>.setTotal(<font color="#0000ff">this</font>.getTotal() + count);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.write(data, 0, count);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;}<br/>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> <font color="#0000ff">true</font>;<br/>
&nbsp;&nbsp;}<br/>
}<br/>
<br/>
<font color="#0000ff">public</font> <font color="#0000ff">class</font> DownloadBatch {<br/>
<br/>
&nbsp;&nbsp;<font color="#0000ff">public</font> boolean download(ArrayList&lt;String[]&gt; tasks) throws IOException {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;Download loader = <font color="#0000ff">new</font> Download();<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">for</font> (String[] task : tasks) {<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader.download(task[0], task[1]);<br/>
&nbsp;&nbsp;&nbsp;&nbsp;}<br/>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> <font color="#0000ff">true</font>;<br/>
&nbsp;&nbsp;}<br/>
}</font><br/>
<br/>
<font color="gray">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font color="gray">Source Code Highlighter</font></a>.</font>



Класс Download скачивает файл с указанного адреса в указанное место, класс DownloadBatch позволяет скачивать пакетно используя класс Download.

Приложение использует только класс DownloadBatch, процесс загрузки пусть отображается в ProgressDialog в формате — имя загружаемого файла/сколько скачано.


Каким образом отображать эту информацию в реальном времени в ProgressDialog?

Главный нюанс — классы Download и DownloadBatch править нельзя.


В голову пришли только две идеи:
  1. Юзать АОП, к примеру с помощью AspectJ
  2. Написать класс, объект которого будет периодично опрашивать класс DownloadBatch



Я не уверен, что это лучшие варианты и хотел бы узнать мнение более опытных людей — как лучше поступать в таких ситуациях.
  • Вопрос задан
  • 3162 просмотра
Пригласить эксперта
Ответы на вопрос 1
anmipo
@anmipo
Если классы Download и DownloadBatch изменять нельзя — то никак, потому что состояние прогресса знает только loader, объявленный в DownloadBatch.download() и не существующий вне этого метода.

Если всё же код можно менять, можно адаптировать пример из этой статьи: "Процессы и потоки в Android: пишем AsyncTask правильно" (только почитайте комментарии).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы