Android:AsyncTask 异步任务使用

1、AsyncTask 简单说明

1).AsyncTask < Integer,Integer,String> 参数说明

  参数一:需要被执行的输入参数,与 AsyncTask 重写的 doInBackground()方法有关系

  参数二:这个参数表示后台任务完成的类型,与onProgressUpdate()方法有关

  参数三:后台任务完成后,返回结果的类型,与onProgressUpdate()和onPostExecute()有关

@Override
protected String doInBackground(Integer... integers) {
    
    
@Override
protected void onProgressUpdate(Integer... values){
    
    

  1、onProgressUpdate()

@Override
protected String doInBackground(Integer... integers) {
    
    
    while (myDownload++ != 6){
    
    
        try{
    
    
            Thread.sleep(1000);
            publishProgress(myDownload);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
    return "finish";
}

  2、onPostExecute()

@Override
protected void onPostExecute(String s) {
    
    
    super.onPostExecute(s);
    Log.d("test",s);
2).AsyncTask 方法说明(可以按顺序分 4 步)

   1、起手式:onPreExecute(),用于AsyncTask 的准备工作

@Override
protected void onPreExecute() {
    
    
    super.onPreExecute();
    progressDialog = new ProgressDialog(context);
    progressDialog.setTitle("执行任务");
    progressDialog.setMessage("任务正在进行,请稍候...");
    progressDialog.setCancelable(false);
    progressDialog.setMax(5);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setIndeterminate(false);
    progressDialog.show();
}

  2、平剑式:onProgressUpdate(Integer… values) ,关于参数在上已述。如果想要得到 String 表示完成类型,将 Integer 以及开始类继承的参数全改为 String 。在这里是返回一个 int 值表示进度完成情况。

@Override
protected void onProgressUpdate(Integer... values) {
    
    
    super.onProgressUpdate(values);
    progressDialog.setProgress(values[0]);
}

  3、荡剑式:个人感觉 doInBackground(Integer… integers) 很像 handler ,负责处理耗时操作。所以这个方法是必须重写的。

@Override
protected String doInBackground(Integer... integers) {
    
    
    while (myDownload++ != 6){
    
    
        try{
    
    
            Thread.sleep(1000);
            publishProgress(myDownload);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
    return "finish";
}

  说明:在这个方法中,除了执行耗时操作,还要执行publishProgress(myDownload)这个方法,传递的参数根据自己的情况会不同。通过这个方法,将 myDownload 这个参数传入到 onProgressUpdate()方法中,用于执行更新操作。

  4、回剑式:就是结束线程用的方法,当执行完荡剑式后,onPostExecute()方法就会在最后执行,收拾残局。想接收什么类型的参数都可以自己定义形参,doInBackground()会配合的。

@Override
protected void onPostExecute(String s) {
    
    
    super.onPostExecute(s);
    Log.d("test",s);
    try {
    
    
        Thread.sleep(1000);
    } catch (InterruptedException e) {
    
    
        e.printStackTrace();
    }
    progressDialog.dismiss();
}
3).使用

   在主进程中,实例化一个对象,然后通过 execute() 方法执行。每个 AsyncTask 只能执行一次,多次调用会出现异常。


new MyAsyncTask(this).execute();

2、代码案例(供参考)

@Override
protected void onCreate(Bundle savedInstanceState) {
    
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_handle_demo);
    ButterKnife.bind(this);

    new MyAsyncTask(this).execute();
}

//AsyncTask内部类部分
class MyAsyncTask extends AsyncTask<Integer,Integer,String>{
    
    

    ProgressDialog progressDialog;
    Context context;
    int myDownload = 0;

    public MyAsyncTask(Context ctx){
    
    
        this.context = ctx;
    }

    @Override
    protected String doInBackground(Integer... integers) {
    
    
        while (myDownload++ != 6){
    
    
            try{
    
    
                Thread.sleep(1000);
                publishProgress(myDownload);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
        return "finish";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
    
    
        super.onProgressUpdate(values);
        progressDialog.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String s) {
    
    
        super.onPostExecute(s);
        Log.d("test",s);
        try {
    
    
            Thread.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        progressDialog.dismiss();
    }

    @Override
    protected void onPreExecute() {
    
    
        super.onPreExecute();
        progressDialog = new ProgressDialog(context);
        progressDialog.setTitle("执行任务");
        progressDialog.setMessage("任务正在进行,请稍候...");
        progressDialog.setCancelable(false);
        progressDialog.setMax(5);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setIndeterminate(false);
        progressDialog.show();
    }
}

3、感想:AsyncTask 的三个参数好像不是必须的。

    这三个参数,可以根据需要做出变更,简单来说就是如果不需要某些过程,那么这个参数的作用也就可有可无。,又或者直接定义为null,不做操作。自己梳理后凭感觉吧。

   欢迎留言评论,一起学习,共同进步。

猜你喜欢

转载自blog.csdn.net/weixin_49101726/article/details/114326848
今日推荐