Как реализовать несколько загрузок с обновлением индикатора выполнения ??

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);



    }

}

Вопрос: Как я могу реализовать несколько функций загрузки, чтобы индикатор выполнения показывал ход каждой загрузки отдельно?

Теги:
android-asynctask
android-gridview
android-progressbar

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;

    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню