Вопрос

i try to put the progress bar into the notification. but the problem is the system will not respond for few seconds and progress bar stuck at beginning once it's started, please take note that even the progress bar is get stuck-ed but the file is still downloading.

Below is the code, please guide me how to deal with the progress bar.

public class StaffChoice extends Activity {
    public static final int DIALOG_DOWNLOAD_PROGRESS = 0;

    ProgressBar progressBar;
    private int progress = 10;

    Intent MyI;
    PendingIntent MyPI;
    NotificationManager MyNM;
    Notification notification;
    NotificationManager notificationManager;

    private void startDownload() {
        String url = "http://www.domainurl.com/3d.png";     //this is not a valid url
        DownloadFileAsync dfa = new DownloadFileAsync();
        dfa.setActivity(StaffChoice.this);
        dfa.execute(url);
        }

       public void onTaskCompleted() {
           dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
       }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.staffchoices);

        MyI = new Intent(getApplicationContext(), MaxAppsAct.class);
        MyPI = PendingIntent.getActivity(getApplicationContext(), 0, MyI, 0);
        MyNM = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(this, StaffChoice.class);
        final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);

        notification = new Notification(R.drawable.logo, "Downloading...", System.currentTimeMillis());
        notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
        notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.staffchoices);
        notification.contentIntent = pendingIntent;
        notification.contentView.setImageViewResource(R.id.imgIcon, R.drawable.save);
        notification.contentView.setTextViewText(R.id.tvText, "Downloading...");
        notification.contentView.setProgressBar(R.id.pbStatus, 100, progress, false);

        notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE);

        notificationManager.notify(42, notification);        
        startDownload();
        }

    public class DownloadFileAsync extends AsyncTask<String, String, String> {
        StaffChoice activity;
        private boolean completed;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
            }

        @Override
        protected String doInBackground(String... aurl) {
        int count;
        try {
            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();

            int lenghtOfFile = conexion.getContentLength();
            Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
            File folder = new File(Environment.getExternalStorageDirectory() + "/MaxApps");
            boolean success = false;
            if (!folder.exists()) {
                success = folder.mkdirs();
                }
            if (!success) {

            } else {

            }

            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/MaxApps/3d.png");

            byte data[] = new byte[1024];
            long total = 0;

            while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress(""+(int)((total*100)/lenghtOfFile));
            output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
            } catch (Exception e) {}
        return null;
        }

        protected void onProgressUpdate(Integer... progress) {
            notification.contentView.setProgressBar(R.id.pbStatus, 100, progress[0], false);
            notificationManager.notify(42, notification);
            }

        @Override
        protected void onPostExecute(String unused) {
            completed = true;
            notifyActivityTaskCompleted();
            }

        public void setActivity(StaffChoice activity){
            this.activity = activity;
            if (completed) {
                notifyActivityTaskCompleted();
                }
            }

        private void notifyActivityTaskCompleted() {
            if (null != activity) {
                activity.onTaskCompleted();
                }
            }
        }
    }

Logcat:

Это было полезно?

Решение

I recommend you shouldn't use AsyncTask inside a thread.

To show notification, in your AysnTask, add following code:

 @Override
 protected void onProgressUpdate(Integer... progress) {
     notification.contentView.setProgressBar(R.id.pbStatus, 100, progress[0], false);
     notificationManager.notify(42, notification);
 }

Update: error in the logcat look like this (the dismiss dialog cause error): http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/

You can try this:

class YourActivity extends Activity {

private void startDownload() {
String url = "http://www.domainurl.com/3d.png";
DownloadFileAsync dfa = new DownloadFileAsync();
dfa.setActivity(YourActivity.this);
dfa.execute(url);
 }

   public void onTaskCompleted() {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
   }

   public void dismissDialog(int id){
    //...
   }

   public void showDialog(int id){
    //...
   }

public class DownloadFileAsync extends AsyncTask<String, String, String> {

YourActivity activity;
    private boolean completed;

@Override
protected void onPreExecute() {
    super.onPreExecute();
    activity.showDialog(DIALOG_DOWNLOAD_PROGRESS);
}

@Override
protected String doInBackground(String... aurl) {
    // nothing change
}

protected void onProgressUpdate(Integer... progress) {
    notification.contentView.setProgressBar(R.id.pbStatus, 100, progress[0], false);
    notificationManager.notify(42, notification);
}

@Override
protected void onPostExecute(String unused) {
        completed = true;
        notifyActivityTaskCompleted();

}
}

public void setActivity(YourActivity activity){
           this.activity = activity;
           if ( completed ) {
            notifyActivityTaskCompleted();
           }

private void notifyActivityTaskCompleted() {
if (null != activity) {
    activity.onTaskCompleted();
}

}
}

When you use publishProgress in doInBackground, it should update the progress to notification

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top