2011-08-17 11 views
6

Tengo un problema extraño, tengo una nueva asynctask lanzada cada vez que encuentro un archivo MP3 en el navegador web, y lanzo una barra de progreso en la vista de lista para cada AsyncTask. Por lo tanto, el número de descargas puede ser más de 1 y simultáneo. Pero ahora cada vez que se mueve launced AsyncTask ProgressBar misma para todos y no diferente para diferentes AsyncTask, PLZ me guía .......Barra de progreso en la vista de lista mientras descarga el archivo AsyncTask

LISTVIEW WITH PROGRESS BAR

public class CopyOfDownloadsListActivity extends ListActivity { 
    /** Called when the activity is first created. */ 

// static ArrayList<String> pthreads = new ArrayList<String>(); 
ImageView bt; 
ProgressBar pb; 
ListView allList; 
TextView tv; 
String fileName; 
String mp3URL; 
    URL url2; 
    int filecount = 0; 

private class DownloadFile extends AsyncTask<String, Integer, Void>{ 
    MyCustomAdapter adapter; 

    int count = 0; 
    ProgressDialog dialog; 
    ProgressBar progressBar; 
    int myProgress; 

    @Override   
    protected Void doInBackground(String... u) {   
     try {     
      URL ul = new URL(u[0]); 
      Log.i("UI",ul.toString()); 
     // int len = CopyOfMusicDownloader.mp3urls.size(); 
     // URL url2 = new URL(CopyOfMusicDownloader.mp3urls.get(len-1)); 
      HttpURLConnection c = (HttpURLConnection) ul.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 

      int lengthOfFile = c.getContentLength(); 

      String PATH = Environment.getExternalStorageDirectory() 
        + "/download/"; 
      Log.v("", "PATH: " + PATH); 
      File file = new File(PATH); 
      file.mkdirs(); 

      fileName = "Track"; 
      filecount++; 

      fileName = fileName + Integer.toString(filecount) + ".mp3"; 


      File outputFile = new File(file, fileName); 
      FileOutputStream fos = new FileOutputStream(outputFile); 
      InputStream is = c.getInputStream(); 

      byte[] buffer = new byte[1024]; 
      int len1 = 0;  
      while ((len1 = is.read(buffer)) != -1) { 
       myProgress = (int)((len1/lengthOfFile)*100); 
       myProgress = myProgress + myProgress; 
       Log.i("lengthOfFile", Integer.toString(lengthOfFile)); 
       Log.i("My Progress", Integer.toString(myProgress)); 
       publishProgress(myProgress); 
       fos.write(buffer, 0, len1); 
      } 
      fos.close(); 
      is.close(); 

      }catch (IOException e) { 
        e.printStackTrace(); 
      } 
     return null; 
    } 

    protected void onPostExecute() { 
    } 

    @Override 
    protected void onPreExecute() {   
      adapter = new MyCustomAdapter(CopyOfDownloadsListActivity.this, R.layout.row, CopyOfMusicDownloader.mp3urls); 
      setListAdapter(adapter); 
    } 



    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.i("Value", values[0].toString()); 
     count++; 
     adapter.notifyDataSetChanged(); 
    } 


    public class MyCustomAdapter extends ArrayAdapter<String> {  
     public MyCustomAdapter(Context context, int textViewResourceId, ArrayList<String> pthreads) { 
     super(context, textViewResourceId, pthreads); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       LayoutInflater inflater = getLayoutInflater(); 
       View row = inflater.inflate(R.layout.row, parent, false); 
       bt =(ImageView)row.findViewById(R.id.cancel_btn); 
       tv =(TextView)row.findViewById(R.id.filetext); 
       pb = (ProgressBar)row.findViewById(R.id.progressbar_Horizontal); 
       pb.setProgress(count); 
       return row; 
      } 
     }  
} 

Esto se inicie el AsyncTask, y su onCreate nuevo DownloadFile(). execute (url2.toString());

Respuesta

3

Su tema es este static ProgressBar pb;

Usted no puede tener una única referencia estático y esperar para controlar múltiples barras de progreso. Completamente encapsular ProgressBar dentro de AsyncTask, conviértalo en una variable de instancia.

EDITAR

En onProgressUpdate necesita cambiar el progreso de la ProgressBar. No necesita un adaptador para cada fila, es un desperdicio.

@Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.i("Value", values[0].toString()); 
     count++; 
     progressBar.setProgress(count); 
    } 

También nunca se asigna un valor progressBar, a mantener la evaluación de pb, deshacerse de esa variable! En usted, PreExecute, sigue reasignando el adaptador de la Lista.

Necesita MUCHAS modificaciones. Cree un adaptador único que administre la vista de lista. Cada fila puede tener una AsyncTask que mantiene su propia barra de progreso, vista de imagen y vista de texto.

+0

Gracias lo quité, pero el problema persiste ....... :( – Programmer

4

Además, lea las notas de ejecutar() aquí:

http://developer.android.com/reference/android/os/AsyncTask.html#execute%28Params...%29

Después de nido de abeja, habrá sólo un hilo conductor a todas las ASyncTasks por lo que probablemente no se puede ejecutar más de una al mismo tiempo. Después del primero, el resto hará cola y no se ejecutará hasta que termine el primero. Probablemente necesites realizar cada descarga en un subproceso y usar una sola ASyncTask para supervisarlas todas. (También puede supervisar desde un subproceso, pero debe realizar pasos adicionales para publicar de forma segura las actualizaciones en la interfaz de usuario en el subproceso de interfaz de usuario).

+0

gracias por señalarlo, no sabía que lo estaban cambiando a un grupo de serie por defecto. – smith324

+0

np - solo lo aprendí de la manera difícil :) – Fraser

+1

La manera difícil? Los documentos dicen que no se ha cambiado aún. – smith324

Cuestiones relacionadas