Arhn - архитектура программирования

уведомление о плохом поведении загрузки файла android

Здравствуйте, у меня есть класс для загрузки файла. Он работает, как и ожидалось, за исключением уведомления об удалении, когда загрузка завершена. Я отмечаю, что два одинаковых участка кода на самом деле дают разные вещи. Я имею в виду, что теперь у меня следующее поведение: я начинаю скачивать файл и могу отменить их, нажав на уведомление. Загрузка отменена, как и ожидалось, та, что должна быть прервана. Но если дождаться окончания загрузки. Второе уведомление будет прервано, когда закончится первое, и первое уведомление останется на панели уведомлений навсегда. Я не знаю, где моя ошибка. Пример кода:

public class DownloadVkVideoFiles extends AsyncTask<String, Integer, String>{
    private static String BROADCAST_ACTION = "com.yourshows.helper.DownloadVkVideoFile.CANCELID";

    public DownloadVkVideoFiles(Context c, String title, int taskId) {
    this.context = c;
    this.notifyId = taskId; //this is unique notification Id
    this.BROADCAST_ACTION += String.valueOf(taskId); //broadcast action for pending intent
    }

   @Override
   protected void onPreExecute() {
        // execute the status bar notification
        createNotification();
        super.onPreExecute();
        IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION);
        context.registerReceiver(receiver, filter); //register Receiver for cancel download file
     }

    @Override
    protected String doInBackground(String... params) { //download file}

    @Override
    public void onProgressUpdate(Integer... progress) {
         notification.contentView.setProgressBar(R.id.progressBar, 100, progress[0], false);
         // inform the progress bar of updates in progress
         notificationManager.notify(notifyId, notification);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        notificationManager.cancel(notifyId); // close finished notification
        unregisterReceiver();
        LOG.send(LOG.I, TAG, "Notification finished with ID = " + notifyId);
    }

    @Override
     protected void onCancelled() {
        super.onCancelled();
        notificationManager.cancel(notifyId);
        unregisterReceiver();

        LOG.send(LOG.I, TAG, "Notification finished with ID = " + notifyId);
    }
}

UPD: createNotification:

    public void createNotification() {
         notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
         Intent notificationIntent = new Intent();
         notificationIntent.setAction(BROADCAST_ACTION);

         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

         RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.download_notification);

         // TODO change to shows title
         tickerText = context.getResources().getText(R.string.downloadTitle);
         icon = android.R.drawable.stat_sys_download;
         time = System.currentTimeMillis();

         notification = new Notification(icon, tickerText, time);
         notification.flags |= Notification.FLAG_ONGOING_EVENT;
         notification.flags |= Notification.FLAG_AUTO_CANCEL;
         notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;

         contentView.setImageViewResource(R.id.downloadImage, R.drawable.download);
         contentView.setTextColor(R.id.title, notification_text_color);
         contentView.setFloat(R.id.title, "setTextSize", notification_text_size - 3);
         contentView.setTextViewText(R.id.title, title);
         contentView.setProgressBar(R.id.progressBar, 100, 0, false);

         notification.contentIntent = pendingIntent;
         notification.contentView = contentView;
        //notificationManager.notify(notifyId, notification);
         service.startForeground(notifyId, notification);
    }
24.01.2012

Ответы:


1

Я пробовал что-то подобное в своем проекте, но если вы попытаетесь загрузить более 5 файлов, загружаемые файлы будут вести себя неожиданно, все файлы будут повреждены. поэтому я меняю структуру на Service вместо AsyncTask. загрузки, хранящиеся в очереди на загрузку, одна за другой, панель уведомлений содержит номер загрузки, текущее имя файла и процент загрузки.

24.01.2012
  • я запускаю шесть задач одновременно, и все они загружаются успешно. Но проблема в том, что 5 уведомлений, расположенных в панели уведомлений, даже тогда, когда задачи загрузки были завершены. 24.01.2012
  • Я пытался скачать 5 файлов каждый размером около 5 МБ, большинство из них были повреждены. пожалуйста, добавьте функцию создания уведомлений. 24.01.2012
  • Пожалуйста, смотрите мой upd. у меня тоже были файлы повреждений, но это моя ошибка. Это произошло, когда у меня было такое же имя файлов. Файлы перезаписывались друг другом. В любом случае, я думаю, что действительно было бы лучше сделать эту функцию, как вы предложили. Это позволяет избежать моей проблемы. 24.01.2012
  • если вам нужна помощь в обслуживании, сообщите мне 24.01.2012
  • У меня уже есть сервис. Я начал переписывать логику. Спасибо. 24.01.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..