Асинхронная задача Android не останавливается, пока загрузка завершена

Я пытаюсь загрузить файл с помощью DownloadManager в асинхронной задаче. Вот метод doInBackground()

protected Boolean doInBackground(String... params) {
        DownloadManager mgr = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        //String DIRECTORY_DOWNLOADS = m_context.getExternalFilesDir(null).getAbsolutePath();

        Uri uri = Uri.parse(params[0]);
        typ_mapy = Integer.parseInt(params[2]);
        File download = new File(getExternalFilesDir(null) ,params[1]);
        if(download.exists()){
            info = "Existuje";
            nazev_souboru=params[1];
            return false;
        }else{

            try {
                long lastDownload = mgr.enqueue(new DownloadManager.Request(uri)
                                    .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI)
                                    .setAllowedOverRoaming(false)
                                    .setNotificationVisibility(Request.VISIBILITY_HIDDEN)
                                    .setDestinationInExternalFilesDir(m_context,"/",params[1]));
                    Cursor c = mgr.query(new DownloadManager.Query().setFilterById(lastDownload));
                    while(c.moveToFirst())
                    {


                        publishProgress(String.valueOf(c.getLong(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))), String.valueOf(c.getLong(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))));
                        /*if(c.getLong(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))>=c.getLong(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))){
                            c.close();
                            return true;
                        }*/
                        c.close();
                        c = mgr.query(new DownloadManager.Query().setFilterById(lastDownload));
                        c.moveToFirst();
                    }

            } catch (Exception e) {
                return false;
            }
            return true;
        }
    }

Вы видите, что у меня есть комментарий. Я думал, что это условие остановит цикл, когда загрузка будет завершена, но когда оно там, оно просто немедленно вызывает onPostExecute() (хотя загрузка выполняется и заканчивается).

Проблема в том, что он перестает вызывать onProgressUpdate(), где я обновляю свой индикатор выполнения.

Есть ли способ сохранить его в цикле while, чтобы индикатор выполнения обновлялся? Если это так, он остается там в бесконечном цикле. Если я раскомментирую условие, оно мгновенно завершится.

EDIT: я решил это, изменив цикл следующим образом:

boolean downloading = true;
                    while (downloading) {

                        DownloadManager.Query q = new DownloadManager.Query();
                        q.setFilterById(lastDownload);

                        Cursor cursor = mgr.query(q);
                        cursor.moveToFirst();
                        long bytes_downloaded = cursor.getLong(cursor
                                .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                        long bytes_total = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                        publishProgress(String.valueOf(bytes_total), String.valueOf(bytes_downloaded));
                        if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
                            downloading = false;
                        }
                    }

Ответ найден здесь: Показать ход загрузки внутри активности с помощью DownloadManager


person Zdeněk Braun    schedule 29.03.2014    source источник


Ответы (1)


Привет, вам нужно зарегистрировать широковещательный приемник, чтобы получить завершенную загрузку. скачать/DownloadDemo.java" rel="nofollow">https://github.com/commonsguy/cw-android/blob/master/Internet/Download/src/com/commonsware/android/download/DownloadDemo.java

person Ravi Kant    schedule 29.03.2014
comment
Решил это другим решением (в EDIT), но ваша ссылка помогла мне понять, как работать с приемниками. Спасибо - person Zdeněk Braun; 29.03.2014