使用AsyncTask类

作者: dayang | 来源:发表于2016-12-07 20:41 被阅读142次
一、继承AsycnTask

继承AsyncTask类时,AsyncTask<Params,Progress,Result>类的三种泛型参数:

  • params:表示启动任务执行的输入参数,该参数是doInBackground()形参,也是execute()开启线程任务的形参;
  • Progress:表示进度参数,publishProgress()onProgressUpdate()形参;
  • Result:doInBackground()法中返回的类型,*onPostExecute()形参;
class MyAsyncTask2 extends AsyncTask<Integer,String,Double>{
    @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.png
案例xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载"
        android:onClick="onClick"/>
    <ProgressBar
        android:id="@+id/proBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:max="100"/>
    <TextView
        android:id="@+id/tvAsync"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="17sp"/>
</LinearLayout>
案例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()参数
    //<Params,Progress,Result>
    class MyAsyncTask extends AsyncTask<Integer,Integer,Void>{
        //这个方法的代码,会在一个单独 的后台线程中被执行
        //因此,它可以做耗时操作,但不能更新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面试问题

    一、什么是AsyncTask AsyncTask是安卓提供的轻量级的异步类,使用时可以继承AsyncTask,在类...

  • Android-AsyncTask使用与源码解析

    AsyncTask使用 AsyncTask是一个抽象类,使用时需要创建子类继承。其类声明如下:public abs...

  • 使用AsyncTask类

    一、继承AsycnTask 继承AsyncTask类时,AsyncTask 类的三种泛型参数: params:表示...

  • AsyncTask使用篇

    AsyncTask的使用流程 创建一个类继承AsyncTask类,并实现相关方法 定义一个接口类,来回调数据 在活...

  • Android AsyncTask基础知识整理

    一、AsyncTask的简介 AsyncTask是一个抽象泛型类,它是由Android封装的轻量级异步类(使用方便...

  • AsyncTask 学习

    AsyncTask 类常用于处理 Android 的异步任务。 本文概括AsyncTask 的使用和简单分析内部实...

  • Android中的AsyncTask使用详解

    AsyncTask使用 AsyncTask是一个泛型类,它提供了Params,Progress,Result三个泛...

  • AsyncTask基础一

    类的使用 AsyncTask 是一个抽象类,需要被继承,继承AsyncTask需要指定如下三个泛型参数: 构建其子...

  • AyncTask源码解析

    AsyncTask是个abstract类,所以在使用时需要实现一个AsyncTask的具体实现类,一般来说会覆盖4...

  • 走马观花之-AsyncTask

    AsyncTask类声明   AsyncTask可以更简单地使用UI线程。该类允许你在后台执行操作,且不需要操纵线...

网友评论

本文标题:使用AsyncTask类

本文链接:https://www.haomeiwen.com/subject/tekjmttx.html