Обновление уведомлений на PostExecute AsyncTask - PullRequest
0 голосов
/ 05 октября 2018
<-- Android/Java --->

private NotificationManager mNotifyManager;
private NotificationCompat.Builder build;
final int id = 101;

private class Download extends AsyncTask<Void, Integer, Integer> {

      @Override
      protected void onPreExecute() {
         super.onPreExecute();

         // Displays the progress bar for the first time.
         build.setProgress(100, 0, false);
         mNotifyManager.notify(id, build.build());
      }

      @Override
      protected void onProgressUpdate(Integer... values) {
         // Update progress
         build.setProgress(100, values[0], false);
         mNotifyManager.notify(id, build.build());
         super.onProgressUpdate(values);
      }

      @Override
      protected Integer doInBackground(Void... params) {
            //.........

                    FileOutputStream f = new FileOutputStream(new File(rootFile,
                            arg0[1]));

                    InputStream in = c.getInputStream();
                    byte[] buffer = new byte[1024];
                    int len1 = 0;
                    float conLen = c.getContentLength();
                    float total = 0;
                    while ((len1 = in.read(buffer)) > 0) {
                        f.write(buffer, 0, len1);
                        total += len1;
                        publishProgress((int) (total * 100 / conLen));
                    }
                    f.close();

         return result;
      }

      @Override
      protected void onPostExecute(Integer result) {
         super.onPostExecute(result);
         Log.e(TAG,"in PostExecute");
         build.setContentText("Download complete");
         // Removes the progress bar
         build.setProgress(0, 0, false);
         mNotifyManager.notify(id, build.build());
      }
   }

}

Проблема

Все мысли работают нормально, но когда я нахожусь в postExecute Уведомление не обновляется

Каждый получает, где яидет не так?

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Спасибо всем, кто мне помог, я решил это вчера

 protected void onPostExecute(Integer result) {
     super.onPostExecute(result);
     DownloadDone();
  }

Сначала я отменил свое уведомление, а затем снова показал

public void DonwloadDone()
        {
            mNotifyManager.cancel(id);
            mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            build = new NotificationCompat.Builder(getBaseContext());
            build.setContentTitle("Download")
                    .setContentText("Complete")
                    .setSmallIcon(R.drawable.ic_launcher_foreground);
            Notification notification = build.build();
            mNotifyManager.notify(id, notification);
            sendMyBroadCast("Complete",fx.getPath());

        }
0 голосов
/ 08 мая 2019

Пожалуйста, попробуйте это решение

 private class Download extends AsyncTask<Void, Integer, Integer> {
    //        int NOTIFICATION_ID = 1;
    int PROGRESS_MAX = 100;
    int PROGRESS_CURRENT = 0;
    int NOTIFICATION_ID = 1;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        // Displays the progress bar for the first time.
        build.setProgress(100, 0, false);
        mNotifyManager.notify(NOTIFICATION_ID, build.build());
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // Update progress
//            updateExportProgress(100);
//            build.setProgress(100, tempProgress, false);
        build.setContentText("Downloading... " + tempProgress * 100 / PROGRESS_MAX + 
"%")
                .setProgress(PROGRESS_MAX, tempProgress, false);
        mNotifyManager.notify(NOTIFICATION_ID, build.build());
        super.onProgressUpdate(values);
    }

    @Override
    protected Integer doInBackground(Void... params) {
        int i;
        for (i = 0; i <= tempProgress; i += 5) {
            // Sets the progress indicator completion percentage
            publishProgress(Math.min(i, 100));
            try {
                // Sleep for 5 seconds
                Thread.sleep(2 * 1000);
            } catch (InterruptedException e) {
                Log.d("Failure", "sleeping failure");
            }
        }
        return null;
    }


    @Override
    protected void onPostExecute(Integer filePath) {
        super.onPostExecute(filePath);
        build.setContentText("Download complete")
                .setProgress(0, 0, false);



        }*/
}
0 голосов
/ 05 октября 2018

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

...