Android: Как загрузить файл и показать уведомление с помощью progressbar?

#android #asynchronous #notifications #progress-bar

#Android #асинхронный #уведомления #индикатор выполнения

Вопрос:

У меня есть действие, которое загружает файл из Интернета при нажатии кнопки. Загрузка файла выполняется с помощью внутренней AsyncTask. Загрузка работает, я даже могу показывать, обновлять и скрывать виджет progressbar в Activitys layout.xml использование AsyncTask. Я также могу показать уведомление из этой асинхронной задачи. Однако я не могу обновить progressbar внутри уведомления из AsyncTask. Я получаю принудительное закрытие, как только обрабатывается первое обновление. При необходимости я предоставлю свой код!

Спасибо за ваше время

 InvocationTargetException.<init>(Throwable) line: 50    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not              available [native method] 
Method.invoke(Object, Object...) line: 507  
ZygoteInit$MethodAndArgsCaller.run() line: 845  
ZygoteInit.main(String[]) line: 603 
NativeStart.main(String[]) line: not available [native method]  
  

Это отображается в этой строке

 myContentView.setProgressBar(R.id.status_progress, 100, Integer.parseInt(progress[0]), false);
  

Вот мой код

 protected String doInBackground(String... aurl) {
int count;

try {

URL url = new URL(aurl[0]);
String path = url.getPath();
String filename = new File(path).getName();
Environment.getExternalStorageDirectory();
File tm = new File("/sdcard/Transform Mii/");
tm.mkdirs();
File out = new File(tm, filename);
URLConnection conexion = url.openConnection();
conexion.connect();

int lenghtOfFile = conexion.getContentLength();
Log.d("ANDRO_ASYNC", "Lenght of file: "   lenghtOfFile);

InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(out);

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(String... progress) {
progressbar.setProgress(Integer.parseInt(progress[0]));
myContentView.setProgressBar(R.id.status_progress, 100, Integer.parseInt(progress[0]), false);
notificationManager.notify(NOTIF_ID, notification);
}
  

progressbar — это панель, которая находится в layout.xml , это обновляется нормально

myContentView progressbar — это панель, которая находится внутри уведомления

Комментарии:

1. Трассировка стека была бы отличной.

2. Какую ошибку вы получаете? Проверьте logcat.

3. Обновляете ли вы виджет progressbar с помощью метода onProgressUpdate ()? При обновлении из doInBackground() могут возникать ошибки, поскольку этот метод выполняется в другом потоке, в то время как onProgressUpdate() выполняется в потоке пользовательского интерфейса.

4. @ruslan да, обновление выполняется через onProgressUpdate. В любом случае спасибо

5. опубликуйте некоторый код, ваш метод onProgressUpdate и часть в doInBackground, которая его вызывает.