1

描述:我有一个网格视图,横向模式有 4 个项目,纵向模式有 3 个项目。网格元素是杂志缩略图。单击该杂志的缩略图开始下载,并出现一个水平进度条,显示下载进度。但是当我一个接一个地点击两个缩略图时,后来点击的缩略图的进度条只会更新,最后损坏的杂志被下载了。我使用异步任务进行杂志下载。

代码:

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {


    progress = (ProgressBar) arg1.findViewById(R.id.progress);
    thumbnail = (ImageView) arg1.findViewById(R.id.thumbnail);



    thumbnail.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Download Magazine
             downloadMagazine.execute(bank.get(index).getPdfLink());

            }
    });

}


class DownloadMagazineTask extends AsyncTask<String, Integer, Long> {
    File sdDir = Environment.getExternalStorageDirectory();

    @Override
    protected void onPreExecute() {

       progress.setVisibility(View.VISIBLE);

    }

    @Override
    protected Long doInBackground(String... arg0) {

        String[] urls = arg0;

        try {
            URL url = new URL(urls[0]);
            URLConnection con = url.openConnection();
            int fileLength = con.getContentLength();

            InputStream input = new BufferedInputStream(url.openStream());

            File file = null;

            File dir = new File(sdDir + "/BeSpoken/pdfs");
            boolean flag = dir.mkdirs();
            if (flag)

                System.out.println("Directory created");
            else {
                System.out.println("Directory not created");
                file = new File(dir+ "/"+ bank.get(index).getPdfLink().substring(bank.get(index).getPdfLink().lastIndexOf("/")));

            }
            OutputStream output = new FileOutputStream(file);

            byte data[] = new byte[1024];
            long total = 0;

            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }


            String m = bank.get(index).getTitle();
            manager.updateDownloadedMagazines(
                    Integer.parseInt(m.substring(m.lastIndexOf(" ") + 1)),
                    file.toString());
            output.flush();
            output.close();
            input.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        startActivity(getIntent());
        finish();

        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {

        super.onProgressUpdate(values);
        progress.setProgress(values[0]);

    }

    @Override
    protected void onPostExecute(Long result) {

        super.onPostExecute(result);

        progress.setVisibility(View.INVISIBLE);



    }

}

问题:如何实现多个下载功能,以便进度条单独显示每个下载的进度?

4

1 回答 1

0

I have defined the image view and the progress bar as final and sending these references to the AsyncTask where the magazine downloading activity is going, on click of image view. AsyncTask spawns multiple threads and that's how progress of each download can be updated.Code:

   @Override
    public View getView(final int position, View convertView, ViewGroup arg2) {

        View grid;

        if (convertView == null) {
            grid = new View(context);
            grid = layoutInflater.inflate(item, null);

        } else {
            grid = (View) convertView;
        }

        final TextView title = (TextView) grid.findViewById(R.id.mgntitle);
        title.setText(bank.get(position).getTitle());
        final ImageView imageView = (ImageView) grid
                .findViewById(R.id.thumbnail);
        imageView.setImageResource(R.drawable.icon);
        final ProgressBar progress = (ProgressBar) grid
                .findViewById(R.id.progress);
        final ImageView downloadmark = (ImageView) grid
                .findViewById(R.id.downloadmark);
        String pdfLink = bank.get(position).getPdfLink();
        String filename = pdfLink.substring(pdfLink.lastIndexOf("/") + 1);
        final File targetDir = new File(fileLocation + filename);
        System.out.println("target file name " + targetDir);

        if (new File(fileLocation + filename).exists()) {
            if (!getPrefName(filename).equalsIgnoreCase("NA")) {
                downloadmark.setVisibility(View.VISIBLE);
            }
        }



        imageView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                if (!targetDir.exists()) {
                        map.put(bank.get(position).getTitle(), progress);
                        new DoBackgroundTask(GridDisplayActivity.this, bank
                                .get(position).getPdfLink(), progress,
                                downloadmark, imageView, position)
                                .execute();


                }


            }

        });

        imageView.setImageBitmap(BitmapFactory.decodeByteArray(
                bank.get(position).getCoverPages(), 0, bank.get(position)
                        .getCoverPages().length));


        return grid;

    }
于 2012-08-29T11:22:33.287 回答