View Full Version : فهمیدن اتمام کدوم پردازش در AsyncTask
  
hamedg1366
دوشنبه 12 آبان 1393, 21:13 عصر
سلام عزیزان
در حال انجام پروژه ای هستم ک توش چند لینک رو همزمان به AsyncTask میفرستم برای دانلود فایل مشکلم اینجاست که نمیتونم با کد نویسی پایان هر نخ رو بدست بیارم و یا میزان پیشرفت هر نخ رو ،
به عنوان مثال امکان داره 6 نخ در حال فعالیت باشن :
نخ شماره 1 در 20% کار باشه ، شماره 2  70% ، شماره 3 تموم شده باشه و ... چطور این اطلاعات رو توی برنامه بدست بیارم ؟
از همتون ممنونم 
(برام حیاتیه لطفا کمکم کنید:افسرده:)
pbm_soy
سه شنبه 13 آبان 1393, 01: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, 09: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();
            }
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.