onProgressUpdate не работает

private class DownloadTextTask extends AsyncTask<String,Long,Long> {

        CharSequence contentText;
        Context context;
        CharSequence contentTitle;
        PendingIntent contentIntent;
        int ID = 1;
        long time;
        int icon;
        CharSequence tickerText;

        @Override
        protected Long doInBackground(String... urls) {
            InputStream inputStream = null;
            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse httpResponse = httpclient.execute(new HttpGet(urls[0]));
                inputStream = httpResponse.getEntity().getContent();
                byte[] buffer = IOUtils.toByteArray(inputStream);
                FileOutputStream fos = new FileOutputStream(MEDIA_PATH + "/fileName.mp3");
                fos.write(buffer);
                fos.flush();
                fos.close();    
            } catch (Exception e) {
            }
            return (long) 100;
        }

        @Override
        protected void onPostExecute(Long result) {
            contentText = result + "% complete";
            contentTitle="Downloading Finished!";
            notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
            notificationManager.notify(ID, notification);
        }

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

         @Override
         public void onProgressUpdate(Long... progress) {
                super.onProgressUpdate(progress);
                contentText = progress[0] + "% complete";
                notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
                notificationManager.notify(ID, notification);
         }

           public void downloadNotification(){
                String ns = Context.NOTIFICATION_SERVICE;
                notificationManager = (NotificationManager) getSystemService(ns);

                icon = R.drawable.downicon;
                //the text that appears first on the status bar
                tickerText = "Downloading...";
                time = System.currentTimeMillis();

                notification = new Notification(icon, tickerText, time);

                context = getApplicationContext();
                //the bold font
                contentTitle = "Your download is in progress";
                //the text that needs to change
                contentText = "0% complete";
                Intent notificationIntent = new Intent(Intent.ACTION_VIEW);
               // notificationIntent.setType("audio/*");
                contentIntent = PendingIntent.getActivity(context, 0, notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

                notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
                notificationManager.notify(ID, notification);

            }
    }

Я написал этот код для загрузки mp3-файла, проблема в том, что он не обновляет ход загрузки файла! Я использую класс IOUtils для преобразования InputStream в byte[]. Я не знаю, как публиковать прогресс в этом случае! Пожалуйста, помогите мне.


person Desire    schedule 10.04.2013    source источник
comment
См. пример в документе AsyncTask Java. Он показывает, как правильно использовать метод publishProgress; developer.android.com/reference/android/os/AsyncTask.html   -  person harism    schedule 10.04.2013


Ответы (3)


Я не думаю, что у IOUtils.toByteArray(..) есть способ предоставить обновление прогресса. Если файл большой, вы, вероятно, все равно не захотите читать его целиком в память. Вы можете использовать CountingInputStream для отслеживания общего количества прочитанных байтов.

public long countContent(URL urls) {
  try {
     //...
     CountingInputStream counter = new CountingInputStream(httpResponse.getEntity().getContent());
     FileOutputStream os = new FileOutputStream(MEDIA_PATH + "/fileName.mp3");

     int read;
     byte[] buffer = new byte[1028];
     while ((read = counter.read(buffer)) != -1) {
        os.write(buffer, 0, read);
        publishProgress(counter.getByteCount()/size);
     }
     // ...
     return counter.getByteCount()/size;
  } catch (IOException ex) {
     throw new RuntimeException(ex);
  }
}
person Frohnzie    schedule 10.04.2013

Вам нужно вызвать publishProgress(param) в doInBackground()

http://developer.android.com/reference/android/os/AsyncTask.html

  1. doInBackground(Params...), вызывается в фоновом потоке сразу после завершения выполнения onPreExecute(). Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. На этот шаг передаются параметры асинхронной задачи. Результат вычисления должен быть возвращен этим шагом и будет передан обратно на последний шаг. На этом шаге также можно использовать publishProgress(Progress...) для публикации одной или нескольких единиц хода выполнения. Эти значения публикуются в потоке пользовательского интерфейса на шаге onProgressUpdate(Progress...).

  2. onProgressUpdate(Progress...), вызывается в потоке пользовательского интерфейса после вызова publishProgress(Progress...). Время выполнения не определено. Этот метод используется для отображения любого прогресса в пользовательском интерфейсе, пока фоновые вычисления все еще выполняются. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.

Пример @ http://www.androidhive.info/2012/04/android-downloading-file-by-showing-progress-bar/

        OutputStream output = new FileOutputStream("/sdcard/file_name.extension")
        long total = 0;
        int count;
        while ((count = inputStream.read(buffer) != -1) {
            total += count;
            // publishing the progress....
            publishProgress((int) (total * 100 / fileLength));
            output.write(buffer, 0, count);
        }
person Raghunandan    schedule 10.04.2013
comment
Я использую класс IOUtils для преобразования InputStream в byte[]. Я не знаю, как публиковать прогресс в этом случае! - person Desire; 10.04.2013
comment
проверьте последнюю ссылку в ответе. - person Raghunandan; 10.04.2013
comment
проверьте рабочий код по ссылке. это должно помочь вам или проверить, что эта ссылка имеет отличное объяснение и альтернативы a-progressdialog" title="загрузить файл с Android и показать прогресс в диалоге прогресса"> stackoverflow.com/questions/3028306/ - person Raghunandan; 10.04.2013

Все функции AsyncTask имеют спецификатор доступа protected.

Так должно быть:

@Override
     protected void onProgressUpdate(Long... progress) {
            super.onProgressUpdate(progress);
            contentText = progress[0] + "% complete";
            notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
            notificationManager.notify(ID, notification);
     }
person Karthik Balakrishnan    schedule 10.04.2013
comment
Попробуйте закомментировать super.onProgressUpdate(progress); - person Karthik Balakrishnan; 10.04.2013