به نام خدا.

سریع میریم سراغ آموزش که مفهوم اسینک تسک، در جاوا یا به اصطلاح در اندروید میتونیم از این قابلیت استفاده کنیم. اسینک تسک یک کلاسی است که به شما اجازه میده در بکگراند کارتون یه کارهای رو انجام بدید و بعد از پایان کار بتونید اون رو کنترل کنید مثلا برای اینکه شما وارد نرم افزار شدید می خواهید یک فایلی رو دانلود کنید کاری که میکنید یک کلاس از اسینک تسک ارث بری میکنید

و متد هاش رو مینویسید. در اسینک تسک چند متد باید نوشته بشه که اینا هستن:

1.doInBackground

2.onPostExecute

این دو متد رو حتما باید بنویسید مگرنه نمیتونید از این کلاس استفاده کنید خب متد اولی زمانی که اجرا میشه کار هایی که گفتید رو انجام میده و نتیجه رو return میکنه وقتی return میکنه به متد دوم (onPostExecute) میره و اونجا به عنوان ورودی دریافت میکنه و عملیات پایانی رو مثلا ذخیره کردن یا نمایش دادن رو انجام میده اما متد های دیگه ای هم داره که اگه اونا رو ننوشتید مشکلی ایجاد نمیکنه مثلا متد onPreExecute که میتونه برای شروع کار چیز هایی رو که می خواهید انجام بده مثلا یک پروگرس بار نشون بده که در متد دوم اون پروگرس بار رو کنسل میکنیم تا نمایشش پنهان بشه. برای اینکه بتونید اون پروگرس بار رو کنترل کنید یا یک درصدی رو بنویسید می تونید از متد onProgressUpdate استفاده کنید که به شما یه آرایه از Integer میده که شما فقط به اولیش نیاز دارید (که اولین مقدار در آرایه میشه عدد 0). خب تا اینجا فهمیدیم که اسینک تسک یعنی چی، کار این کلاس چیه، و متد های اون چی هستن

شما میتونید برای دانلود کردن فایلی از اینترنت به همراه پرگرس بار از کلاس زیر استفاده کنید:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import android.support.v7.app.NotificationCompat.Builder;
import android.app.NotificationManager;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.PowerManager;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.Toast;

public class DownloadTask extends AsyncTask<String, Integer, String> {

	private Context context;
	private String name;
	private String link;
	private NotificationManager mNotifyManager;
	private Builder mBuilder;
	int id = 1;
	String pathpublic;
	String title;
	private String type;

    public DownloadTask(Context context,String name, String type,String title) {
        this.context = context;
        try {
			this.name =  java.net.URLDecoder.decode(name, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			this.name = name;
			e.printStackTrace();
		}
        this.type = type;
        this.title = title;

		mNotifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
		mBuilder = new NotificationCompat.Builder(context);
		mBuilder.setContentTitle("دانلود")
				.setContentText("در حال دریافت...")
				.setSmallIcon(R.drawable.ic_download);
    }

    @Override
	protected void onPreExecute() {
		super.onPreExecute();
		mBuilder.setProgress(100, 0, false);
		mBuilder.setAutoCancel(false);
		mNotifyManager.notify(id, mBuilder.build());
	}

    
    @Override
    protected String doInBackground(String... sUrl) {
    	link = sUrl[0];
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
                return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage();

            int fileLength = connection.getContentLength();
            input = connection.getInputStream();
            
            String status = Environment.getExternalStorageState();
    		String path = "";
    		if (status.equals("mounted")) {
    			String dir = Environment.getExternalStorageDirectory()
    					+ File.separator + "YourDirctory";
    			File folder = new File(dir);
    			if (!folder.exists()) {
    				folder.mkdirs();
    			}
    			File FolderFanBox = new File(dir, name +"."+ type);
    			path = FolderFanBox + "";
    			pathpublic = path;
    		}
    			
            output = new FileOutputStream(path);

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                if (fileLength > 0) // only if total length is known
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
        	Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            	Toast.makeText(context, ignored.getMessage(), Toast.LENGTH_LONG).show();
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
    


    @Override
    protected void onProgressUpdate(Integer... progress) {
    	mBuilder.setProgress(100, progress[0], false);
		mNotifyManager.notify(id, mBuilder.build());
		super.onProgressUpdate(progress);
      
    }

    @Override
    protected void onPostExecute(String result) {
     
        mBuilder.setContentText("دانلود کامل شد");
		mBuilder.setProgress(0, 0, false);
		mNotifyManager.cancel(id);
    }
}
   موفق باشید
اگه سوالی بود بنده در خدمتم
یا علی مدد