Практикуюсь в программировании на Java для Android.
Встал вопрос, который не могу корректно решить и хочу услышать ваш совет.
Пример упрощен, но суть следующая — пишу программу для Android, которая получает список ссылок с сервера и скачивает их на телефон, вот два класса, которые используются для загрузки:
<font color="black"><font color="#0000ff">public</font> <font color="#0000ff">class</font> Download {<br/>
<br/>
<font color="#0000ff">public</font> <font color="#0000ff">long</font> getTotal() {<br/>
<font color="#0000ff">return</font> total;<br/>
}<br/>
<br/>
<font color="#0000ff">protected</font> <font color="#0000ff">void</font> setTotal(<font color="#0000ff">long</font> total) {<br/>
<font color="#0000ff">this</font>.total = total;<br/>
}<br/>
<br/>
<font color="#0000ff">private</font> <font color="#0000ff">long</font> total = 0;<br/>
<br/>
<font color="#0000ff">public</font> boolean download(String link, String path) throws IOException {<br/>
<br/>
<font color="#008000">// download the file</font><br/>
InputStream input = <font color="#0000ff">new</font> BufferedInputStream(url.openStream());<br/>
OutputStream output = <font color="#0000ff">new</font> FileOutputStream(outputFile);<br/>
<br/>
<font color="#0000ff">int</font> count = 0;<br/>
<font color="#0000ff">byte</font> data[] = <font color="#0000ff">new</font> <font color="#0000ff">byte</font>[1024];<br/>
<br/>
<font color="#0000ff">while</font> ((count = input.read(data)) != -1) {<br/>
<font color="#0000ff">this</font>.setTotal(<font color="#0000ff">this</font>.getTotal() + count);<br/>
output.write(data, 0, count);<br/>
}<br/>
<br/>
<font color="#0000ff">return</font> <font color="#0000ff">true</font>;<br/>
}<br/>
}<br/>
<br/>
<font color="#0000ff">public</font> <font color="#0000ff">class</font> DownloadBatch {<br/>
<br/>
<font color="#0000ff">public</font> boolean download(ArrayList<String[]> tasks) throws IOException {<br/>
<br/>
Download loader = <font color="#0000ff">new</font> Download();<br/>
<br/>
<font color="#0000ff">for</font> (String[] task : tasks) {<br/>
loader.download(task[0], task[1]);<br/>
}<br/>
<br/>
<font color="#0000ff">return</font> <font color="#0000ff">true</font>;<br/>
}<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 править нельзя.
В голову пришли только две идеи:
- Юзать АОП, к примеру с помощью AspectJ
- Написать класс, объект которого будет периодично опрашивать класс DownloadBatch
Я не уверен, что это лучшие варианты и хотел бы узнать мнение более опытных людей — как лучше поступать в таких ситуациях.