Barre de progression dans la listview tout AsyncTask téléchargement de fichier
J'ai un étrange problème, j'ai un nouveau asynctask launced chaque fois que je trouve un fichier MP3 sur webbrowser, et lance une barre de progression dans la liste pour chaque AsyncTask. Si nombre de téléchargements peut être supérieur à 1 et simultanée. Mais maintenant, chaque fois que Asynctask est launced ProgressBar se déplace même pour tous et pas pour différentes AsyncTask, Plz me guider.......
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;
}
}
}
C'est l'AsyncTask démarrer, et son onCreate
nouveau DownloadFile().execute(url2.toString());
InformationsquelleAutor Programmer | 2011-08-17
Vous devez vous connecter pour publier un commentaire.
Votre question est ce
static ProgressBar pb;
Vous ne pouvez pas avoir un seul point de référence fixe et s'attendre à contrôler plusieurs barres de progression. Entièrement d'encapsuler le composant ProgressBar à l'intérieur de l'AsyncTask, en faire une variable d'instance.
MODIFIER
Dans onProgressUpdate vous avez besoin de changer les progrès de la ProgressBar. Vous n'avez pas besoin d'un adaptateur pour chaque ligne, son gaspillage de ressources.
Vous également de ne pas assigner une valeur progressBar, vous gardez l'évaluation de
pb
, de se débarrasser de cette variable! En vous PreExecute vous garder réaffectation des de la Liste de l'adaptateur.Vous avez besoin de BEAUCOUP de modifications. Créer une carte unique qui gère la listview. Chaque ligne peut avoir un AsyncTask qui gère sa propre barre de progression, d'affichage de l'image et affichage de texte.
Également lire les notes sur execute() ici:
http://developer.android.com/reference/android/os/AsyncTask.html#execute%28Params...%29
Après en Nid d'abeille, il y aura un seul thread en cours d'exécution toutes les ASyncTasks de sorte que vous ne pouvez probablement pas exécuter plusieurs simultanément. Après la première, le reste de la file d'attente et ne sera pas exécuté tant que le premier se termine. Vous aurez probablement besoin effectuer chaque téléchargement à partir d'un Fil et d'utiliser un seul ASyncTask pour surveiller tous. (Vous pouvez surveiller à partir d'un Fil trop, mais vous devez prendre des mesures supplémentaires en toute sécurité de poster des mises à jour de l'INTERFACE utilisateur sur le thread de l'INTERFACE utilisateur).