0

プログレスバーを通知に入れようとしています。しかし、問題は、システムが数秒間応答せず、プログレス バーが開始されると最初からスタックすることです。プログレス バーでさえスタックしますが、ファイルはまだダウンロード中であることに注意してください。

以下はコードです。進行状況バーの処理方法を教えてください。

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

ログキャット:

4

1 に答える 1

2

スレッド内で AsyncTask を使用しないことをお勧めします。

通知を表示するには、AysnTask に次のコードを追加します。

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

更新: logcat のエラーは次のようになります (ダイアログを閉じるとエラーが発生します): 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();
}

}
}

doInBackgroundpublishProgressを使用すると、進行状況が通知に更新されます。

于 2012-06-12T07:00:40.967 に答える