通知中的进度条

时间:2012-06-12 05:50:44

标签: android progress-bar notificationmanager

我尝试将进度条放入通知中。但问题是系统一旦启动就不会响应几秒钟而且进度条会在开始时停留,请注意,即使进度条被卡住了,但文件仍在下载。

下面是代码,请指导我如何处理进度条。

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:

1 个答案:

答案 0 :(得分:2)

我建议您不要在线程中使用AsyncTask。

要显示通知,请在您的AysnTask中添加以下代码:

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

更新:logcat中的错误如下所示(dismiss对话框导致错误): http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/

你可以试试这个:

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();
}

}
}

doInBackground 中使用 publishProgress 时,应将进度更新为通知