私のアプリでは、たくさんのファイルをダウンロードする必要があります。私の当初の計画では、ファイルごとに個別の AsyncTask を使用して、各ファイルがダウンロードされたときにアプリの残りの部分に通知できるようにしていました。これが機能している間、実際にはメモリ効率が悪いように見えることをテストしていることがわかりました。単一の AsyncTask またはサービスを使用してファイルをダウンロードし、各ファイルが完了したことを通知する良い方法はありますか?
3 に答える
多数の を使用する理由はありませんAsyncTask
。ファイル名のリストを作成し、それを単一の に渡し、各ファイルがダウンロードされた後、 UI スレッドで実行され、他のアクティビティに簡単に通知できる および を使用しAsyncTask
てダウンロードの進行状況を公開できるためです。あなたのアプリケーションで。publishProgress()
onProgressUpdate()
private class DownloadFilesTask extends AsyncTask<URL, String, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
for (int i = 0; i < count; i++) {
Downloader.downloadFile(urls[i]);
publishProgress(urls[i].toString());
}
return 0;
}
protected void onProgressUpdate(String... progress) {
// notify whomever you like with url from progress[0]
// this is run on UI thread
}
protected void onPostExecute(Long result) {
// do something else
// this is also run on UI thread
}
}
リモートサービスは機能しますが、機能が制限されているため、これは間違ったアプローチだと思います。
AsyncTaskを使用しますが、メソッドによって呼び出されます。
AsyncTaskが終了したら、リスト内の項目を削除するか、カウンターを更新した後、新しいAsyncTaskを作成するメソッドを再度呼び出します。
AsyncTaskは再利用できないため、毎回新しく作成する必要があることに注意してください。
メモリとネットワークの観点からは、1つのAsyncTask(またはJavaスレッド)を使用して、すべてのファイルを1つずつダウンロードする方がよいでしょう。これにより、デバイスの応答性が大幅に向上し、メモリを少し消費します。サーバー側を制御できる場合は、小さいファイルを1つのアーカイブに圧縮することもお勧めします(私のプロジェクトでもHTTP経由で多くのファイルをダウンロードします)。ファイルを約2のサイズのアーカイブに結合すると、速度が大幅に向上します。 4MBおよびダウンロード。TCP / IP接続のみを使用してダウンロードする場合、毎回接続を再確立しない限り、ファイルのサイズは関係ありません。しかし、HTTPの場合、最大の時間の浪費は通常、接続の確立です。