1

説明: 横向きモードで 4 つのアイテム、縦向きモードで 3 つのアイテムを含むグリッド ビューがあります。グリッド要素は雑誌のサムネイルです。サムネイルをクリックすると、雑誌のダウンロードが開始され、ダウンロードの進行状況を示す水平の進行状況バーが表示されます。しかし、2 つのサムネイルを次々とクリックすると、後でクリックしたサムネイルのプログレス バーのみが更新され、最後に破損したマガジンがダウンロードされます。雑誌のダウンロードに非同期タスクを使用しました。

コード:

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

画像ビューとプログレス バーを最終的なものとして定義し、画像ビューをクリックすると、これらの参照を雑誌のダウンロード アクティビティが進行中の AsyncTask に送信します。AsyncTask は複数のスレッドを生成し、それが各ダウンロードの進行状況を更新する方法です。コード:

   @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 に答える