2011-08-13 1 views
0

J'ai une tâche asyncfichier mp3 via AsyncTask et avoir la barre de progression listview android

nouvelle DownloadFile() execute (url2.toString()).

Chaque fois que je trouve un fichier mp3 sur url par exemple www.xyz.com/preview.mp3

J'appelle la tâche async ci-dessus

nouvelle DownloadFile(). Execute (url2.toString())

Ensuite, j'ai aussi une barre de progression dans une vue de liste, Mais maintenant la barre de progression n'est pas mise à jour J'utilise un adaptateur personnalisé et j'ai gonflé la vue correctement.

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

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

       private class DownloadFile extends AsyncTask<String, Integer, Void>{ 
        int count = 0; 
        ProgressDialog dialog; 
        int myProgess = 0; 
        ProgressBar progressBar; 

        @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*100/lengthOfFile); 
           //myProgress = (int)(len1); 

           Log.i("My Progress", Integer.toString(myProgress)); 
           publishProgress(myProgress); 
           // publishProgress((int)(len1*100/lengthOfFile)); 
           fos.write(buffer, 0, len1); 
          } 
          fos.close(); 
          is.close(); 

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

        protected void onPostExecute() { 

        } 

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

        } 



        @Override 
        protected void onProgressUpdate(Integer... values) { 
         pb.setProgress(count);// HERE IS THE PROBLEM 

         count++; 
         Log.i("Values", Integer.toString(values[0])); 
        } 
       } 

       @Override 
       public void onCreate(Bundle savedInstanceState) { 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        super.onCreate(savedInstanceState); 

        int len = CopyOfMusicDownloader.mp3urls.size(); 
        try { 
         url2 = new URL(CopyOfMusicDownloader.mp3urls.get(len-1)); 
         new DownloadFile().execute(url2.toString()); 
         Log.i("url",url2.toString()); 
        } catch (MalformedURLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

       } 

       @Override 
       public boolean onCreateOptionsMenu(Menu menu) { 
        MenuInflater myMenuInflater = getMenuInflater(); 
        myMenuInflater.inflate(R.menu.menu, menu); 
        return true; 
       } 

       @Override 
       public boolean onOptionsItemSelected(MenuItem item) { 
        switch(item.getItemId()){ 
        case(R.id.browsermenu): 
        Intent i = new Intent(CopyOfDownloadsListActivity.this, MusicDownloader.class); 
        startActivity(i); 
        break; 
        case(R.id.downloaderrmenu):  
        break; 
        case(R.id.playermenu): 
        Intent j = new Intent(CopyOfDownloadsListActivity.this, Players.class); 
        startActivity(j); 
        break; 
       } 
       return true; 
       } 


       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); 
          return row; 
         } 
        } 


      } 
+0

Pourriez-vous mettre cela sous la forme d'une question? Je ne suis pas vraiment sûr de ce que vous demandez. – Phil

Répondre

0

i pense c'est le problème (je ne ai pas tester votre code)

myProgress = (int)(len1*100/lengthOfFile); 

cela doit ressembler à ceci

myProgress += (int)(len1*100/lengthOfFile); 
+0

Non ... le problème est de savoir comment mettre à jour une barre de progression dans listview, où chaque barre de progression est associée à une asyncTask. Et chaque AsyncTask est créé chaque fois que le fichier .mp3 sur l'URL est trouvé. – Programmer

1

est que ce que vous cherchez ?

private class DownloadFile extends AsyncTask<String, Integer, Void> { 
    ProgressBar progressBar; 
    public DownloadFile(ProgressBar progressBar) { 
     this.progressBar=progressBar; 
    } 


    @Override 
    protected void onProgressUpdate(Integer... values) { 
     progressBar.setProgress(count); 
    } 

} 

maintenant, tous les DownloadFile Task ont sa propre ProgressBar.

+0

Merci pour la réponse ,,, mais cela pourrait être une réponse si je n'avais que la barre de progression. mais le problème est que j'ai une barre de progression en vue liste, donc sur preexecute je setAdapter. Mais alors le problème est de savoir comment lier chaque barre de progression dans listview avec chaque asynctask. – Programmer

+0

Vous devez appeler le code ci-dessus dans l'adaptateur comme DownloadFile (Progressbar) .execute(); .. de cette façon, vous pouvez avoir une seule progression pour un élément de liste unique .. – Nepster

0

Je sais que cette question est ancienne, mais quelqu'un pourrait traverser comme je l'ai fait. Voici mon code. Peut-être que ce n'est pas la meilleure approche, mais je dois le faire fonctionner dès que possible. Mon élément adaptateur

ChatRow

public class ChatRow { 
    private int progressCount; 
    private boolean sending; 

     public boolean isSending() 
     { 
      return sending; 
     } 

     public void setSending(boolean sending) 
     { 
      this.sending = sending; 
     } 

      public int getProgressCount() { 
       return progressCount; 
      } 

      public void setProgressCount(int progressCount) { 
       this.progressCount = progressCount; 
      } 
} 

sur la méthode getView de mon adaptateur ai cette partie du Code

if (row.isSending()) { 
    holder.progressBar.setVisibility(View.VISIBLE); 
    holder.progressBar.setProgress(row.getProgressCount()); 
} 

et sur mon AsyncTask SendFileTask

private class SendFileTask extends AsyncTask<String, Integer, Boolean> { 
    private ChatRow row; 

    public SendFileTask(int rowNumber) { 
     this.row = adapter.getItem(rowNumber); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Logger.d(String.format("progress[%d]", values[0])); 
     row.setProgressCount(values[0]); 
     adapter.notifyDataSetChanged(); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     row.setSending(false); 
     row.setProgressCount(0); 
     adapter.notifyDataSetChanged(); 
    } 
Questions connexes