نمایش دانلود فایل در دیالوگ ( تورو خدا اگه کسی میدونه کمک کنه )
با سلام خدمت دوستان و اساتید بزرگوار . راسش سعی میکنم به صورت کامل مشکلمو بگم امیدوارم که کمکم کنید .
فرض کنید توو پروژه ی مارکت استاد بعد ازین که رو دکمه ی (( نصب )) کلیک شد انتطار این رو داشته باشیم که روند انجام دانلود رو درون یک دیالوگ به شکل زیر داشته باشیم.

به همین منظور من کارهایی رو که انجام دادم رو تک تک شرح میدم , امیدوارم که مشکلم رو با کمک شما حل کنم .
من اومدم در کلاس DownloadRequest یک سری کد به این کلاس اضافه کردم که این بخش ها ی اضافه شده رو پایین مشخص کردم
public class DownloadRequest {
private int downloadedSize; private int totalSize; private int percent; public int getDownloadedSize() { return downloadedSize; } public int getTotalSize() { return totalSize; } public int getPercent() { return percent; } public DownloadRequest download() { Thread thread = new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(downloadPath); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.connect(); totalSize = connection.getContentLength(); File file = new File(filepath); if (file.exists()) { file.delete(); } FileOutputStream outputStream = new FileOutputStream(filepath); InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[G.DOWNLOAD_BUFFER_SIZE]; int len = 0; while ((len = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, len); downloadedSize += len; percent = (int) (100.0f * (float) downloadedSize / totalSize); if (progressListener != null) { ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ final int finalDownloadedSize = downloadedSize; ===============================>> کد مربوط به نمایش پروگرسبار در دیالوگ
G.HANDLER.post(new Runnable() { ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ
@Override ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ public void run() { ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ progressListener.onProgressDownload(percent, finalDownloadedSize, totalSize); >> کد مربوط به نمایش پروگرسبار در دیالوگ
} }); } if (percent == 100 && listener != null) { G.HANDLER.post(new Runnable() { @Override public void run() { listener.onDownloadComplete(downloadPath, filepath); } }); } if (simulate) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } outputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); thread.start(); return this; } private String downloadPath; private String filepath; private OnDownloadCompleteListener listener; private OnProgressDownloadListener progressListener; ============>>> کد مربوط به نمایش پروگرسبار در دیالوگ private boolean simulate; public DownloadRequest downloadPath(String value) { downloadPath = value; return this; } public DownloadRequest filepath(String value) { filepath = value; return this; } public DownloadRequest listener(OnDownloadCompleteListener value) { listener = value; return this; } public DownloadRequest progressListener(OnProgressDownloadListener value) { ============>> کد مربوط به نمایش پروگرسبار در دیالوگ progressListener = value; return this; } public DownloadRequest simulate(boolean value) { simulate = value; return this; } }
بعد ازین کار اومد در جایی که قراره دانلود صورت بگیره در متد دیزاین پترن بیلدر (( listener . )) و (( progressListen . )) رو به متد دانلودم مطابق دستور زیر اضافه کردم.
public static void DownloadFile() {
final String filename = HelperString.getFileName(G.selectedMusic.file);
DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.1.105/Folkolor/" + G.selecteFile.file)
.filepath(G.DIR_App + "/" + filename)
.listener(new OnDownloadCompleteListener() { ====== >> این قسمت به درستی کار میکنه
@Override ====== >> این قسمت به درستی کار میکنه
public void onDownloadComplete(String url, String localPath) { ====== >> این قسمت به درستی کار میکنه
File file = new File(localPath); ====== >> این قسمت به درستی کار میکنه
new File(G.DIR_File + "/" + filename).exists(); ====== >> این قسمت به درستی کار میکنه
}
})
.progressListener(new OnProgressDownloadListener() { ============>> مشکل من در اینجاست
@Override
public void onProgressDownload(int percent, int finalDownloadedSize, int totalSize) { ============>> مشکل من در اینجاست
super.onProgressDownload(percent, finalDownloadedSize, totalSize); ============>> مشکل من در اینجاست
ProgressDialog barProgressDialog = new ProgressDialog(G.currentActivity);============>> مشکل من در اینجاست
barProgressDialog.setTitle("Downloading Music ...");============>> مشکل من در اینجاست
barProgressDialog.setMessage("Downloaded File ...");============>> مشکل من در اینجاست
barProgressDialog.setProgressStyle(barProgressDialog.STYLE_HORIZONTAL);============>> مشکل من در اینجاست
barProgressDialog.setProgress((int) percent);============>> مشکل من در اینجاست
barProgressDialog.show();============>> مشکل من در اینجاست
}
})
.download();
}
راسش نمیدونم چطوری باید این دیالوگ رو نشون بدم که دقیقا همین اطلاعات زیر رو که در عکس هست بم نشون بده

ممنون میشم اگه کد هایی رو که میدونید در اختیارم بزارید. ی ماهه سر این قضیه موندم
با سلام
منم دقیقا مدتی پیش همین مشکل رو داشتم که خوشبختانه تونستم رفعش کنم!!!
کاری که بنده کردم این بود که به جای Progress Dialog یه دیالوگ معمولی گذاشتم و اونو طبق سلیقه خودم طراحی کردم و بعد چون Listener مدام تکرار میشه ، میشه حدس زد که هم دیالوگ موردنظر شما و هم تعریفاتی که کردین چندین بار رخ میده و چندین دیالوگ باز میشه و یا ایجاد کرش میکنه ، شما میتونین برای رفع این مشکل یک متغیر Boolean برای تعریف متغیر های خودتون بگیرین و بعد از نخستین تعریف اون رو برابر false قرار بدین تا دفعات بعدی تکرار نشن .
بنده کد خودم رو قرار میدم ، شما بسته به برنامه خودتون تغییرش بدین ، کد زیر داخل OnClickListener نوشته شده.
موفق باشید./
OnProgressDownloadListener listener = new OnProgressDownloadListener() {
@Override
public void onProgressDownload(int percent, int downloadedSize, int fileSize) {
if (StartDefine)
{
Dialog dialog = new Dialog(G.crnt);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_download);
txtDownload = (TextView) dialog.findViewById(R.id.txtDownload);
prgDownload = (ProgressBar) dialog.findViewById(R.id.prgDownload);
dialog.show();
StartDefine = false;
}
prgDownload.setProgress(percent);
txtDownload.setText(percent + "%");
}
};
StartDefine = true;
FileDownloader.download("SOME_FILE", listener);
علی جان مرسی از راهنمایت اما من هنوز مشکل دارم . من چون از دیزاین پترن بیلدر که استاد آموزش دادند دارم استفاده میکنم راسش هنوز نتونستم این قسمت رو که اگه اشتباه نکنم برای حالت عادی (( غیر دیزاین پترن)) هست رو حل کنم ====>> ;(FileDownloader.download("SOME_FILE", listene
****************************************************************************
راسش من کد هامو به این شکل تغییر دادم که اومد ی کلاس به نام Dilaogs درست کردم و کد های مربوط به نمایش دانلود در دیالوگ رو که به کمک پروگرس بار روند نمایش دانلود رو که در بر داره , درش قرار دادم و توو کلاس مربوطه تحت نام ActivityMusicdetail اونو صدا زدم اما بازم داره ارور میده و نمیدونم داستانش چیه... : اینم کد کلاس دیالوگ :
static void ProgressDownloader() {
final Dialog dialog = new Dialog(G.currentActivity);
dialog.setContentView(R.layout.pr);
final TextView txtDownload = (TextView) dialog.findViewById(R.id.txtDownload);
final TextView totalSizes = (TextView) dialog.findViewById(R.id.totalSizes);
final ProgressBar prgDownload = (ProgressBar) dialog.findViewById(R.id.prgDownload);
dialog.show();
OnProgressDownloadListener listener = new OnProgressDownloadListener() { ==> در این قسمت listener زیرش خط چین داره و جایی صدا زده نشده
private String convertByteToMB(int byteLength) {
float sizeInKB = (float) byteLength / 1024;
float sizeInMB = (float) sizeInKB / 1024;
return String.format("%.1fMB", sizeInMB);
}
@Override
public void onProgressDownload(int percent, int downloadedSize, int fileSize) {
prgDownload.setProgress(percent);
String totalSize = convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize);
txtDownload.setText(percent + "% " + totalSize);
totalSizes.setText(fileSize);
}
};
}
اینم ظاهر بی ریخت و امتحانی دیالوگ من برای تووضیح بیشتر :))))

بعد ازین کار اومدم توو متد مربوطه این کدها رو که در کلاس دیالوگ هس به این شکل صدا زدم
final String filename = HelperString.getFileName(G.selectedMusic.file);
DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.1.105/Folkolor/" + G.selectedMusic.file)
.filepath(G.DIR_MUSIC + "/" + filename)
.listener(new OnDownloadCompleteListener() {
@Override
public void onDownloadComplete(String url, String localPath) {
File file = new File(localPath);
new File(G.DIR_MUSIC + "/" + filename).exists();
}
})
.progressListener(new OnProgressDownloadListener() {
@Override
public void onProgressDownload(int percent, int finalDownloadedSize, int totalSize) {
// TODO Auto-generated method stub
super.onProgressDownload(percent, finalDownloadedSize, totalSize);
Dialogs.ProgressDownloader(); =========================================>> اینجا صدا زدم
}
})
.download();
با این که این کارهارو هم انجام دادم اما اررور داره ... نمیدنم چرا ؟؟ !!!!! ممنون میشم اگه کمک کنید
من اومدم این کارو کردم . این مشکلش چیه الان ؟؟
static void ProgressDownloader() {
View view = G.inflater.inflate(R.layout.pr, null, true);
final Dialog dialog = new Dialog(G.currentActivity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
final ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.prgDownload);
final TextView txtDownload = (TextView) view.findViewById(R.id.txtDownload);
final OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {
private String convertByteToMB(int byteLength) {
float sizeInKB = (float) byteLength / 1024;
float sizeInMB = (float) sizeInKB / 1024;
return String.format("%.1fMB", sizeInMB);
}
@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
progressBar.setProgress(percent);
txtDownload.setText(percent + "% " + convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize));
}
});
}
};
final String filename = HelperString.getFileName(G.selectedMusic.file);
DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.1.105/Folkolor/" + G.selectedMusic.file)
.filepath(G.DIR_MUSIC + "/" + filename)
.listener(new OnDownloadCompleteListener() {
@Override
public void onDownloadComplete(String url, String localPath) {
File file = new File(localPath);
new File(G.DIR_MUSIC + "/" + filename).exists();
}
})
.progressListener(progressListener)
.download();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(30);
G.HANDLER.post(new Runnable() {
@Override
public void run() {
dialog.show();
}
});
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .