android_AsyncTask

本文详细介绍了异步任务处理机制中的关键概念与方法,包括onPreExecute、doInbackground、onProgressUpdate及onPostExecute等方法的用途、执行时机及其参数类型。通过一个具体的示例,展示了如何使用AsyncTask类来实现异步任务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:

异步任务 (很多的网络相关开源框架,大多数都是使用这个)

thread(请求数据) + handler(发送数据到主线程)

说白了就是对前面的组合进行封装,简化程序员的开发

方法简介

  • onPreExecute

    运行线程
    
        主线程执行
    
    运行时机
    
        最先运行的方法,先于任务执行 , 一般在这里面执行一些初始化工作,包括弹出一个对话框,提示用户,目前将要执行耗时操作了。
    
  • doInbackground

    运行的线程

        在子线程中执行,一般多用于执行耗时操作
    

    运行的时机

        在onPreExecute执行完毕只有调用
    

    方法参数

        类上面定义的第一个泛型类型来定
        参数是从execute里面传递过来的,是一个可变参数
    

    方法返回值

        类型有上面的第三个泛型来定义。
    
  • onProgressUpdate

    运行的线程

        在主线线程中执行,一般多用于更新进度
    

    运行的时机

        在调用 publishProgress的时候就执行了。 一般这个 publishProgress方法都是在doInbackground里面调用
    

    方法参数

        类上面定义的第二个泛型类型来定
        参数是从publishProgress里面传递过来的,是一个可变参数
    
  • onPostExecute

    运行的线程

        在主线程执行,一般在这里要做UI的更新了
    

    运行的时机

        在doInbackground执行完毕只有调用
    

    方法参数

        类上面定义的第三个泛型类型来定
        参数是从doInbackground的返回值传递过来的
    

举一个例子

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //new MyAsyncTask().execute(20,30,40);//这里面的值会传递到doInBackground里面去
        MyAsyncTask  task=new MyAsyncTask();
        task.execute(20,30,40);
        //task.cancel(true);//删除任务
    }

    public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {
        ProgressDialog  dialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog=new ProgressDialog(MainActivity.this);
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dialog.show();
            Log.d("tag","在主线程执行哦,并且最先执行");
        }

        @Override 
        protected Integer doInBackground(Integer... params) {//这里方法的类型,由AsyncTask<Integer, Integer, Integer>的第一个类型决定

            for(int i=1;i<6;i++){
                Log.d("tag",params[0]+"::"+params[1]);
                Log.d("tag","doInBackground:"+Thread.currentThread().getName());
                publishProgress(5,i);
                SystemClock.sleep(2000);

            }
            return 50; //这个返回值,由AsyncTask<Integer, Integer, Integer>的第三个类型决定
        }


        @Override
        protected void onProgressUpdate(Integer... values) {//类型由AsyncTask<Integer, Integer, Integer>的第三参数决定
            super.onProgressUpdate(values);
        //值是由publishProgress();传递进来的
            Log.d("tag","values::"+values);
            dialog.setMax(values[0]);
            dialog.setProgress(values[1]);
        }

        @Override
        protected void onPostExecute(Integer result) {//类型由AsyncTask<Integer, Integer, Integer>的第三参数决定
                                                      //参数是从doInbackground的返回值传递过来的
            super.onPostExecute(result);
            dialog.dismiss();
            Toast.makeText(MainActivity.this, "任务结束了", 0).show();

            Log.d("tag",result+":::");
        }
    }

}

注意事项:

  1. Asynctask的执行必须发生在主线程
  2. 请不要直接调用以上4个方法
  3. 任务一旦执行之后,就不能再执行第二次了,除非又重新new了一次task
  4. 如何取消: t.cancel(true);
  5. 从1.6的时候,可以并发多个任务,但是从3.0之后,只能执行单个任务。如果想执行多个任务,那么可以使用 t.executeOnExecutor(exec, params) , 使用指定的线程池来运行任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值