Android 异步任务AsyncTask的使用

来源:互联网 发布:linux ssh端口转发 编辑:程序博客网 时间:2024/04/25 11:26

异步任务AsyncTask的使用


          异步任务类AsyncTask,通俗点说就是可以帮助我们用线程将两段代码不同步的进行,一般的是用来更新UI界面的,(我们知道在子线程中是不能更新UI的,但是在AsyncTask中是可以更新的,不需要将Handler和子线程就可以完成异步操作并且更新UI界面了),当然其他的耗时操作也可以放在里面进行,比如说进行网络的请求或者是数据库的存取之类的...刚接触这个不久,自己也就用过一次,所以对这个不是很熟悉,如果有什么不对的地方还希望各位给小达指出~~~~~,关于异步任务类的内部实现原理,可以参考chenshaoyang0011

            由于我是在做一个天气App的过程中接触到的,所以把里面的源码拿过来做实现的例子.异步任务类是一个抽象类, 在继承了这个抽象类之后,直接在UI线程中调用execute()方法就能实现异步了,AsyncTask<Void,Void,Void>里定义了三种泛型类型,分别是 

                   Params : 在UI线程中实例化继承了异步任务类的类之后,调用execute()时里面放入的参数类型,也就是doInBackground(的 参数类型.这个参数实际上是一个varags,例如String[] , int[] 等等,比如在继承的时候AsyncTask<String,Void,Void>,这样写,那么在doInBackground(String... params)应该对应起来写,实际上这个params应该是一个String类型的数组.

                   Progress : 该参数是在doInBackground()方法执行过程中,不断的产出的参数,相当于异步任务执行进度,为publishProgress()和onProgressUpdate()的参数类型.这个参数和上面的也也一样,也是类似于String[] 的一个东西.
 
                   Result : doInBackground()方法的返回值类型.就只有这个参数稍微正常了点,是String 就是 String .


           使用前先自定义一个类继承它,里面有四个函数:

           一.  doInBackground(Void... params)  这个函数是最主要的,即后台主要运行的代码放在里面,可以执行耗时的方法,其中的参数是可变的,在后面会讲到,这里因为在前面继承AsyncTask的时候是
public class DatabaseAsyncTask extends AsyncTask<Void,Void,Void> {
这个样子继承的,所以doInBackground里面的参数也是Void类型.

           二.  onPreExecute()  此函数在UI线程中调用execute()后,在doInBackground()方法执行之前运行.通过命名也能看的出来哈.

           三.  onProgressUpdate(Void... values)   在publishProgress()被调用以后执行,publishProgress()用于更新进度.

           四.  onPostExecute(Void aVoid)   运行在ui线程中,在doInBackground()执行完毕后执行.

           以上就是我们在运用异步任务类的时候会接触到的几个函数了,将我们需要执行的任务分配一下就能达到想要的目的.下面就结合实例来看看异步任务类怎么发挥作用的...

           先在MainActivity的OnCreate()方法里面实例化了一个继承了AsyncTask的DatabaseAsyncTask类,直接调用databaseAsyncTask.execute()方法,让其在后台查询数据库中的数据.上代码...
/**
  *这部分就是在activity中的两行代码.用起来还是很简单的哈
  */
DatabaseAsyncTask databaseAsyncTask = new DatabaseAsyncTask                (getApplicationContext(),MainActivity.this);        databaseAsyncTask.execute();

下面就是继承了AsyncTask的类,重写了其中的四个方法
public class DatabaseAsyncTask extends AsyncTask<Void,Void,Void>{    private Context context;    private Activity activity;    public DatabaseAsyncTask(Context context,Activity activity) {        this.activity = activity;        this.context = context;    }    /**     * 在doInBackground之前执行     */    @Override    protected void <span style="color:#ff0000;">onPreExecute</span>() {        super.onPreExecute();    }    /**     * 运行在ui线程中,在doInBackground()执行完毕后执行     */    @Override    protected void <span style="color:#ff0000;">onPostExecute</span>(Void aVoid) {        super.onPostExecute(aVoid);    }    /**     * 在publishProgress()被调用以后执行,publishProgress()用于更新进度     */    @Override    protected void <span style="color:#ff0000;">onProgressUpdate</span>(Void... values) {        super.onProgressUpdate(values);    }    /**     * 后台运行的方法,可以运行非UI线程,可以执行耗时的方法     */    @Override    protected Void <span style="color:#ff0000;">doInBackground</span>(Void... params) {        ArrayList<String> cityArrayList = MainActivity.cityArrayList;        if(cityArrayList.size() != 0) {            for(String city : cityArrayList) {                SQLiteUtil.ReadData(city);            }        }        return null;    }}

        结合例子讲完之后,再来说说使用AsyncTask的过程中应该注意的事情:
        
                1) 继承异步任务类的类必须在UI线程中实例化
                
                2) execute()方法也要在UI线程中调用
                
                3) 不要手动的去调用前面说到的那四个函数咯,AsyncTask已经帮我们封装好了线程等东西,手动调用的话就相当于我们new了一个新的线程,直接调用其run()方法一样,会达到异步任务的效果么0.0,不过也可以手动调用的玩玩看~~~~
                
                4) doInBackground()方法中返回值就是onPostExecute()方法(在doInBackground方法执行后执行在UI线程中)传入的参数,需要对应.
                
                5)  实例化之后AsyncTask只能被执行一次,多次调用会出现异常情况的.还是演示下把,看图~~~~



          今天的异步任务就到这里咯,我已经把我所有知道的东西都写出来了,各位有好的建议和意见都可以Q我2319821734或者直接给我留言的~~~~微笑
0 0
原创粉丝点击