列表视图上的取消按钮,asyncTask不起作用。由于adapter.notifyDataSetChanged()的频率很高

时间:2012-11-25 09:25:25

标签: android-listview android-asynctask

我正在开发一个Android应用程序,我使用asyncTask下载文件,并使用以下代码从onProgressUpdate方法更新listView上的进度条。

// 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();
}
...

我在listview上添加了一个按钮,也可以随时取消此下载。按钮单击侦听器如下:

// 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中的那个按钮来取消它,因为这个按钮也经常被刷新。

如果我下载速度慢,那么进度更新频率,那么这样可以正常工作。

我该如何处理这个问题?

0 个答案:

没有答案