ورود

View Full Version : فهمیدن اتمام کدوم پردازش در AsyncTask



hamedg1366
دوشنبه 12 آبان 1393, 20:13 عصر
سلام عزیزان

در حال انجام پروژه ای هستم ک توش چند لینک رو همزمان به AsyncTask میفرستم برای دانلود فایل مشکلم اینجاست که نمیتونم با کد نویسی پایان هر نخ رو بدست بیارم و یا میزان پیشرفت هر نخ رو ،

به عنوان مثال امکان داره 6 نخ در حال فعالیت باشن :

نخ شماره 1 در 20% کار باشه ، شماره 2 70% ، شماره 3 تموم شده باشه و ... چطور این اطلاعات رو توی برنامه بدست بیارم ؟


از همتون ممنونم
(برام حیاتیه لطفا کمکم کنید:افسرده:)

pbm_soy
سه شنبه 13 آبان 1393, 00:23 صبح
خود کلاس AsyncTask متدهایی برای اینکار دارد و میتوانید از آنها استفاده کنید فکر میکنم مثال زیر کافی باشه


private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}

protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}

protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}

hamedg1366
سه شنبه 13 آبان 1393, 08:51 صبح
خود کلاس AsyncTask متدهایی برای اینکار دارد و میتوانید از آنها استفاده کنید فکر میکنم مثال زیر کافی باشه


private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}

protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}

protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}





فک کنم منظورم رو خوب نتونستم بیان کنم

میزان پیشرفت کار هر نخ رو چطور بدست بیارم ؟

کد زیر رو در نظر بگیرین ، ProgressDialog برای نشون دادن اولین دانلود بخوبی کار میکنه اما وقتی نخ اول تموم میشه و تابع onPostExecute ، اجرا میشه ؛ دیگه ProgressDialog بصورت خالی نشون داده میشه و میزان پیشرفت نخ های بعدی (درصد دانلود فایل) اصلا نمایش داده نمیشه ؛ مشکل کجاست ؟




private void show_progressDialog(){
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("In progress...");
progressDialog.setMessage("Loading...");
progressDialog.setProgressStyle(ProgressDialog.STY LE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.setMax(100);
progressDialog.setIcon(R.drawable.arrow_stop_down) ;
progressDialog.setCancelable(true);
progressDialog.show();
}

private class DownloadImageTask extends AsyncTask<URL, Integer, Bitmap> {
protected Bitmap doInBackground(URL... paths) {
try {
...
//
publishProgress((downloaded * 100) / length);

} catch
...
}
return null;
}
protected void onPreExecute() {
super.onPreExecute();
show_progressDialog() ;
}
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
progressDialog.setProgress(progress[0]);
}
protected void onPostExecute(Bitmap result) {
progressDialog.cancel();
}