Progress bar in listview while AsyncTask file download
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).
Comments
-
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.......
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 over 12 yearsthanks for pointing that out, I didn't know they were changing it back to a serial pool by default.
-
Юрій Мазуревич over 8 yearsActually, you can have multiple async tasks. Sinse API 11 you can use [link](developer.android.com/reference/android/os/…, Params...))