Progress bar in listview while AsyncTask file download

10,687

Solution 1

Your issue is this static ProgressBar pb;

You can't have a single static reference and expect to control multiple progress bars. Fully encapsulate the ProgressBar inside the AsyncTask, make it a instance variable.

EDIT

In onProgressUpdate you need to change the progress of the ProgressBar. You don't need an adapter for every row, its wasteful.

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

You also never assign a value progressBar, you keep assessing pb, get rid of that variable! In you PreExecute you keep reassigning the List's adapter.

You need A LOT of modifications. Create a single adapter that manages the listview. Each row can have an AsyncTask that maintains its own progress bar, image view and text view.

Solution 2

Also, read the notes on execute() here:

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

After Honeycomb there will be only one thread running all ASyncTasks so you probably can't run more than one simultaneously. After the first, the rest will queue up and won't execute at all until the first one finishes. You'll probably need to perform each download in a Thread and use a single ASyncTask to monitor all of them. (You can monitor from a Thread too but you need to take extra steps to safely post updates to the UI on the UI thread).

Share:
10,687
Programmer
Author by

Programmer

Android and Windows Mobile developer

Updated on June 27, 2022

Comments

  • Programmer
    Programmer almost 2 years

    I am having a strange issue, I have a new asynctask launced whenever i find an MP3 file on webbrowser, and lauch a progress bar in the listview for each AsyncTask. So number of downloads can be more than 1 and simultaneous. But now whenever Asynctask is launced ProgressBar moves same for all and not different for different AsyncTask, Plz guide me.......

    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;
                }
            }       
     }  
    

    This is the AsyncTask start, and its onCreate new DownloadFile().execute(url2.toString());

  • smith324
    smith324 over 12 years
    thanks for pointing that out, I didn't know they were changing it back to a serial pool by default.
  • Юрій Мазуревич
    Юрій Мазуревич over 8 years
    Actually, you can have multiple async tasks. Sinse API 11 you can use [link](developer.android.com/reference/android/os/…, Params...))