AsyncTask详解

package company.zzw.john.threadtest;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.widget.Toast;

/** * Created by john on 2016/4/3. */

/** * Params------第一个泛型参数设置为Void,表示在执行AsyncTask的时候不需要传入参数给后台任务 * Progress----I---第二个泛型参数设置为Integer,表示使用整型数据作为进度显示单位 * result-----第三个泛型参数设置为Boolean,表示使用布尔型数据来反馈执行结果 */
public class DownloadTask extends AsyncTask<Void, Integer, Boolean> {


    @Override
    protected void onPreExecute() {
        //这个方法会在后台任务执行之前进行调用,用于进行一些界面上的初始化操作,比如添加一个进度对话框
        progressDialog.show();//显示进度对话框
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        //这个方法中所有的代码都会在子线程中运行,在这里进行处理一些耗时的任务,任务一旦完成就
        // 可以通过返回return语句来将任务的执行结果返回,如果AsyncTask的第三个泛型参数设置为Void
        //就可以不返回执行结果,注意这个方法是不允许进行UI操作的,如果需要更新UI元素,比如反馈当前
        //任务的执行进度。可以调用PublishProgress(Progress...)方法来完成。
        try {
            while (true){
                int downloadPercent =doDownloas();
                publishProgress(downloadPercent);
                if (downloadPercent>=100){
                    break;
                }
            }

        }catch (Exception e){
            e.printStackTrace();
        }
        return true;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        //当在后台任务中调用了PublishProgress(Progress...)方法后,这个方法很快就被调用,
        // 方法中携带的参数就是在后台任务中传递来的,在这个方法中可以对UI进行操作,利用参数中的
        // 数值即可以对界面元素进行相应的更新
        ProgressDialog.setMessage("Download"+values[0]+"%");
    }

    @Override
    protected void onPostExecute(Boolean result) {
        //当后台任务执行完毕并通过rerturn语句进行返回时,这个方法就会被调用。返回的数据会作为参数传递
        // 到这个方法中,可以利用返回的数据进行一些Ui操作,比如提醒任务执行的结果,以及关闭进度对话框
        progressDialog.dismiss();//关闭进度对话框
        //在这里提醒任务执行结果
        if (result){
            //提示成功
        }else {
            //提示失败
        }

        super.onPostExecute(aBoolean);
    }
}

你可能感兴趣的:(AsyncTask详解)