使用AsyncTask类

一、继承AsycnTask

继承AsyncTask类时,AsyncTask类的三种泛型参数:

  • params:表示启动任务执行的输入参数,该参数是doInBackground()形参,也是execute()开启线程任务的形参;
  • Progress:表示进度参数,publishProgress()onProgressUpdate()形参;
  • Result:doInBackground()法中返回的类型,*onPostExecute()形参;
class MyAsyncTask2 extends AsyncTask{
    @Override    
    protected Double onProgressUpdate(String... values) {
        super.onProgressUpdate(values);    
}
    @Override
    protected Void doInBackground(Integer... integers) {
        publishProgress("呵呵哒");
        return null;
}
    @Override
    protected void onPostExecute(Double dou) {
        super.onPostExecute(dou);
}
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
}}
二、五个需要掌握的方法:
  • doInBackground();会在一个单独 的后台线程中进行耗时操作
  • onPostExecute();当耗时任务执行完之后,在主线程中调用
  • onPreExecute();耗时任务执行之前,在主线程中调用
  • publishProgress();发布进度,进行进度追踪,onProgressUpdate被调用
  • onProgressUpdate();只有publishProgress被调用,才能在主线程中调用
三、简单案例使用AsyncTask类
案例效果图,下载并显示进度
使用AsyncTask类_第1张图片
AsyncTask.png
案例xml文件


    
案例java文件
  1. 继承AsyncTask类,定义doInBackground()处理参数,publishProgress()进度参数,以及返回参数,重写五个方法
  • doInBackground()方法里,进行耗时操作,调用publishProgress()方法,将值传给onProgressUpdate(),如果是下载,可以更新下载进度;
public class AsyncTaskActivity extends AppCompatActivity {
    TextView textView;
    ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async);
        initView();
    }
    private void initView(){
        textView= (TextView) findViewById(R.id.tvAsync);
        progressBar= (ProgressBar) findViewById(R.id.proBar);
    }

    public void onClick(View view){
        MyAsyncTask task=new MyAsyncTask(); //创建AsyncTask对象
        //在主线程中调用execute()方法
        //execute()方法只能被调用一次,调用多次会报错
        task.execute(0);
    }
    //Integer:初始化的参数:doInBackground
    //Integer:进度的参数:onProgressUpdate()
    //void:doInBackground返回的结果:onPostExecute()参数
    //
    class MyAsyncTask extends AsyncTask{
        //这个方法的代码,会在一个单独 的后台线程中被执行
        //因此,它可以做耗时操作,但不能更新UI
        @Override
        protected Void doInBackground(Integer... integers) {
            int i=integers[0];
            while(i<100){
                i++;
                //发布进度,当这个方法被调用的时候
                //onProgressUpdate()方法会在主线程中被调用
                publishProgress(i);
                try {
                    Thread.sleep(80);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        //当publishProgress调用的时候,这个方法在主线程中调用
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressBar.setProgress(values[0]);
            textView.setText(values[0]+"%");
        }
        //当耗时任务执行完之后,在主线程中调用,
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            Toast.makeText(AsyncTaskActivity.this,"下载完成",Toast.LENGTH_SHORT).show();
        }
        //在耗时任务执行之前,在主线程中调用
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast.makeText(AsyncTaskActivity.this,"下载开始",Toast.LENGTH_SHORT).show();
        }
    }
    }

你可能感兴趣的:(使用AsyncTask类)