una termina reanudar reanudación que porque pendiente pausar las ingles habilitar google evitar detienen descargas descarga como chrome cancelen android android-asynctask download

termina - Android Pausa de descarga múltiple reanudar en lista vista con la actualización de progreso



habilitar reanudación de la descarga en ingles (3)

Estoy intentando descargar varios archivos en la vista de lista con la barra de progreso. Lo que logré es que puedo iniciar una descarga en particular, pausar / reanudarla usando AsyncTask y la barra de progreso se actualiza (para un solo archivo), esta parte funciona bien.

Mi problema es que no puedo descargar varios archivos simultáneamente y cuando dejo la vista de lista a otra pantalla aunque la descarga se realiza en segundo plano pero el progreso no se actualiza, la barra de progreso muestra 0 progreso como si no se estuviera descargando pero ha sido descargando en el fondo.


Cuando abandone su actividad, la actividad que asynctask muestra la barra de progreso se cancela y, por lo tanto, la dosis progressBar ya no se muestra cuando vuelve a la actividad nueva porque la dosis asynctask no conoce su nueva actividad. Solución general que funcionará en todos los casos, por ejemplo, cuando el usuario cierra su aplicación y la abre de nuevo y desea saber el progreso. Barra separa la presentación por completo. eso significa que puede crear sharedPreferences o una tabla de base de datos y poner su estado de su archivo mientras se está descargando su asynctask. por ejemplo, cada 500 milisegundos actualice la tabla SharedPreferences o database con la cantidad descargada del tamaño total del archivo. luego, cuando el usuario vuelva a su nueva actividad, lea desde DB o sharedPreferences para mostrar progressBar y actualizar cada 1000 milisegundos, por ejemplo. De esta forma, su usuario conocerá la barra de progreso incluso si cierra la aplicación y la vuelve a abrir. Sé que toma un poco más de trabajo, pero seguramente hace que tus usuarios sean felices.

para leer y actualizar a velocidad fija puede usar scheduleAtFixedRate


En un gran problema con AsynchTask es cuando finaliza su actividad, AsynchTask pierde su seguimiento con su UI. Después de eso, cuando regrese a esa actividad, progressBar no se está actualizando, incluso si el progreso de la descarga aún se está ejecutando en segundo plano. De hecho, AsynchTask no pertenece a la nueva actividad que aliste, por lo que la nueva instancia de la barra de progreso en la nueva actividad no se actualizará. Para solucionar este problema, te sugiero que:

1- Ejecute un hilo con timerTask en onResume (), que actualiza su barra de progreso con valores actualizados desde el fondo AsyncTask corriendo. Algo como esto:

private void updateProgressBar(){ Runnable runnable = new updateProgress(); background = new Thread(runnable); background.start(); } public class updateProgress implements Runnable { public void run() { while(Thread.currentThread()==background) try { Thread.sleep(1000); Message msg = new Message(); progress = getProgressPercentage(); handler.sendMessage(msg); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (Exception e) { } } } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { progress.setProgress(msg.what); } };

y cuando tu actividad no es visible, debes destruir el hilo:

private void destroyRunningThreads() { if(background!=null) { background.interrupt(); background=null; } }

2- Defina una variable booleana estática global. Establecerlo como verdadero en onPreExecute y en onPostExecute establecerlo en falso. Muestra que está descargando o no, por lo que puede verificar si la variable es igual a true, mostrar el cuadro de diálogo anterior de la barra de progreso. (Puede hacer algo como esto con un valor entero -o una matriz de enteros- para mostrar la actualización porcentaje para cada progreso de descarga).

3- La última forma que usé personalmente es para mostrar el progreso de la descarga en la barra de notificaciones y en mi vista de lista solo muestro que está descargando en este momento o no (usando el segundo método con valores booleanos). De esta forma, incluso si finalizas la actividad, la barra de notificaciones se actualiza con el progreso de la descarga.


Finalmente encontré la respuesta, que era mucho más simple de lo que pensaba, aquí está de la siguiente manera

  1. Crear un service tenga Asynctask para descargar y hashtable de valores (url, Asynctask)
  2. Pase el valor (url, Asynctask) cuando se hace clic en un elemento de la lista y compruebe si esa tabla contiene el valor ya si, en caso afirmativo, cancele esa tarea Asynctask si no la agrega a hashtable e inicie Asynctask.
  3. ahora para actualizar el progreso en mi adapter ejecuté un hilo que itera sobre hashtable y pasa el valor usando BroadcastListener .
  4. Y en actividad, interceptar la broadcast y, dependiendo del ListItem visible, actualizar el progreso

PD: si alguien necesita un código, puedo proporcionar el código básico de la descripción explicada anteriormente

public class DownloadingService extends Service { public static String PROGRESS_UPDATE_ACTION = DownloadingService.class.getName() + ".progress"; private static final long INTERVAL_BROADCAST = 800; private long mLastUpdate = 0; private Hashtable<String, DownloadFile> downloadTable; private LocalBroadcastManager broadcastManager; @Override public int onStartCommand(Intent intent, int flags, int startId) { MessageEntity entityRecieved = (MessageEntity) intent.getSerializableExtra("ENTITY"); queueDownload(entityRecieved); return super.onStartCommand(intent, flags, startId); } private void queueDownload(MessageEntity entityRecieved){ if (downloadTable.containsKey(entityRecieved.getPacketID())) { DownloadFile downloadFile = downloadTable.get(entityRecieved.getPacketID()); if (downloadFile.isCancelled()) { downloadFile = new DownloadFile(entityRecieved); downloadTable.put(entityRecieved.getPacketID(), downloadFile); startDownloadFileTask(downloadFile); } else { downloadFile.cancel(true); downloadTable.remove(entityRecieved.getPacketID()); } } else { DownloadFile downloadFile = new DownloadFile(entityRecieved); downloadTable.put(entityRecieved.getPacketID(), downloadFile); startDownloadFileTask(downloadFile); } } @Override public void onCreate() { super.onCreate(); downloadTable = new Hashtable<String, DownloadFile>(); broadcastManager = LocalBroadcastManager.getInstance(this); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) void startDownloadFileTask(DownloadFile asyncTask) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); else asyncTask.execute(); } private void publishCurrentProgressOneShot(boolean forced) { if (forced || System.currentTimeMillis() - mLastUpdate > INTERVAL_BROADCAST) { mLastUpdate = System.currentTimeMillis(); int[] progresses = new int[downloadTable.size()]; String[] packetIds = new String[downloadTable.size()]; int index = 0; Enumeration<String> enumKey = downloadTable.keys(); while (enumKey.hasMoreElements()) { String key = enumKey.nextElement(); int val = downloadTable.get(key).progress; progresses[index] = val; packetIds[index++] = key; } Intent i = new Intent(); i.setAction(PROGRESS_UPDATE_ACTION); i.putExtra("packetIds", packetIds); i.putExtra("progress", progresses); mBroadcastManager.sendBroadcast(i); } class DownloadFile extends AsyncTask<Void, Integer, Void> { private MessageEntity entity; private File file; private int progress; public DownloadFile(MessageEntity entity) { this.entity = entity; } @Override protected Void doInBackground(Void... arg0) { String filename = entity.getMediaURL().substring(entity.getMediaURL().lastIndexOf(''/'') + 1); file = new File(FileUtil.getAppStorageDir().getPath(), filename); downloadFile(entity.getMediaURL(), file); return null; } public String downloadFile(String download_file_path, File file) { int downloadedSize = 0; int totalSize = 0; try { // download the file here while ((bufferLength = inputStream.read(buffer)) > 0 && !isCancelled()) { progress = percentage; publishCurrentProgressOneShot(true); } } catch (final Exception e) { return null; } return file.getPath(); } }