asyncTask を使用してファイルをダウンロードし、メソッド onProgressUpdate から listView の進行状況バーを次のコードで更新する Android アプリケーションを開発しています。
// In asynctask
@Override
protected String doInBackground(String... aurl) {
int count;
try {
fn = getFileName(aurl[0]); //working fine
URL url = new URL(aurl[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/mnt/sdcard/"+fn);
di.title = fn;
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
if(isCancelled())return (null);
total += count;
publishProgress((int)((total*100)/lenghtOfFile)); //publishing very very frequently as download speed is 3MBPS
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
Log.e("MYAPP", "exception", e);
}
return null;
}
protected void onProgressUpdate(Integer... progress) {
downloaditem.title = fn+" - "+progress[0]+"%";
di.per = progress[0];
adapter.notifyDataSetChanged();
}
...
このダウンロードをいつでもキャンセルできるように、リストビューにもボタンを追加しました。ボタンクリックリスナーは次のとおりです。
// In adapter holder.button is pointing to correct cancel button in listview
holder.button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
DownloadItem.di.cancel(true); // This is also correctly canceling the task
}
});
問題は、ご覧のとおり、非常に頻繁にonProgressUpdate
更新されていることです。listView
このボタンも非常に頻繁に更新されるため、UI でそのボタンをクリックしてキャンセルすることはできません。
ダウンロードを遅くして、progressupdate の頻度を上げれば、問題なく動作します。
どうすればこの問題を処理できますか?