Android- download file + status bar notification slowing down phone

后端 未结 4 1577
难免孤独
难免孤独 2021-02-10 06:22

I currently have an asynctask which downloads a mp3 from a server. When the user starts to download it, a status bar notification is created. This displays the prog

4条回答
  •  野趣味
    野趣味 (楼主)
    2021-02-10 06:57

    I had the same issue that I was not able to update the progress bar notification even with an interval of 3 seconds so after hours of digging I came to realize the fact that whenever we update the notification the RemoteView object must be re-instantiated and re-initialized to the Notification object's contentView. After doing this I was able to update the Notification progress bar with an interval of 100ms-500ms for a very long period without facing any UI blocking.

    Note: If you don't agree you can verify this answer by running this snippet after commenting out the marked line and see the difference. It may take about 5mins to start the severe UI blockage which will heat up your device and may stop functioning. I tried with an S3 mini with Android 4.2.2 and the updateNotification(....) method was called from a worker thread inside a service. and Moreover I already double checked it and don't know what happens when Notification.Builder is used for the same purpose.

    Note: The reason to write this answer after 3 years of the question is because I wonder that I did not find even a single stackoverflow answer or other blog post handling this serious issue with this very simple solution.

    I hope this answer will be helpful for other newbies like me. Enjoy.

    Here is my copy pasted code that you can use directly.... I use the same code for updating a notification layout which contains two ProgressBars and four TextViews with a frequency of 500ms-100ms.

    //long mMaxtTimeoutNanos = 1000000000 // 1000ms.
    long mMinTimeNanos     = 100000000;//100ms minimum update limit. For fast downloads.
    long mMaxtTimeoutNanos = 500000000;//500ms maximum update limit. For Slow downloads
    long mLastTimeNanos = 0;
    private void updateNotification(.....){
        // Max Limit
        if (mUpdateNotification || ((System.nanoTime()-mLastTimeNanos) > mMaxtTimeoutNanos)) {
            // Min Limit
            if (((System.nanoTime() - mLastTimeNanos) > mMinTimeNanos)) {
                mLastTimeNanos = System.nanoTime();
                // instantiate new RemoteViews object.
                // (comment out this line and instantiate somewhere
                // to verify that the above told answer is true)
                mRemoteView = new RemoteViews(getPackageName(),
                        R.layout.downloader_notification_layout);
                // Upate mRemoteView with changed data
                ...
                ...
                // Initialize the already existing Notification contentView
                // object with newly instatiated mRemoteView.
                mNotification.contentView = mRemoteView;
                mNotificationManager.notify(mNotificatoinId, mNotification);
                mUpdateNotification = false;
            }
        }
    }
    

提交回复
热议问题