AsyncTask是Android提供的用于异步消息处理的工具,可以使用它进行后台操作的同时,主界面上出现进度条来显示进度。
使用方法比较简单,首先需要写一个类继承AsyncTask<Void,Intger,Boolean>,第一个参数是表示要传给后台的参数,如果不需要参数就Void即可,第二个参数是指定进度条的显示单位的数据类型,一般Integer整型即可,第三个参数则是执行之后的反馈结果。
经常需要重写的几个办法有:
1、onPreExecute()
这个方法会再后台的任务开始之前就调用,一般用于界面上的初始化,比如显示进度条对话框等等,可以先创建个progressDialog然后在这个方法中.show();
2、doInBackground()
这个方法中写的具体代码都是在子线程中运行的,完成了里面的代码后线程会自动销毁,注意,子线程中是不能更新UI的(有一种特殊情况,假如在Activicy的onCreate()方法中新开一个子线程并且在子线程中对UI界面进行修改,是有可能成功的,只要在onCreate()的方法还未执行完成前,子线程也可以修改其界面,但非常不建议这么做,因为你无法确定onCreate()方法究竟在什么时候走完),如果想要更新UI界面,这里需要使用publishProgress()方法,这个方法调用了之后,下面的onProgressUpdate()就会得到执行,在里面写上具体的更新UI界面代码即可。
3、onProgressUpdate()
当doInBackground()中调用了publishprogress()时候,就会执行这个方法下的代码,从名字可以看出,这个方法其实原本是用于更新进度条的显示进度的,而且一般来讲也都是这么使用的,但是因为他可以更新界面,所以你也可以利用它来做其他的修改。
4、onPostExecute()
当后台的代码走完之后,就会将返回的结果作为参数进入这个方法中,你可以在这里进行一些UI的操作,比如说弹出窗口显示下载成功,将进度条隐藏等等。
关于一开始继承AsyncTask的时候后面跟上的<Void,Integer,Boolean>,除了字面的解释,其实可以发现,当你写完这三个参数之后,重写doInBackgound()、onProgressUpdate()、onPostExecute()三个方法的时候,其输入输出参数也跟着改变了,比方说按照我们现在写好的<Void,Integer,Boolean>,输入参数为Void,那么doInBackground(Void... voids)表示输入参数为void,进度条的单位数据类型是integer,那么onProgressUpdate(Integer... values)接收的参数为integer,最后的boolean是返回值,可以看到boolean doInBackground(Void... voids)的返回值就是boolean,同时onPostExecute(Boolean b)输入参数正是boolean!可以看到Android Studio会根据你写的参数不同改变方法的输入输出参数。
至于AsyncTask的使用,在Activity中new一个新的AsyncTask对象,使用.execute()方法(.execute()方法中要写入doInBackground参数),取消则是使用.cancel(true)。
按照我现在浅显的理解,AsyncTask我认为像是一个已经封装好主线程回调的“子线程”,使用起来还是相当的方便的。作为不是那么方便的比较内容,下面提到一下如果不使用AsyncTask,直接开一个Thread,这时候怎么更新UI界面?答案是使用Handler,在主线程中新建一个Handler类,需要重写里面的handleMessage(Message msg)方法,在这个方法中对传入的参数进行分析,然后走相应的处理代码(用switch)。
Message类是一个消息类,用几个属性:
1、what,是值,比方说有一个int变量名字为INTPARMA,值为1,这里的what你设置为1和INTPARMA都OK,都case得到(请不要吐槽这个,我原先以为是地址判断不是值的判断~。~);
2、arg1和arg2,这两个都是整型的,需要的话可以使用;
3、obj,这个属性比较有用,接受所有Object类型,所有变量都是基于Object的,当然,在handleMessage中接收的时候要记得转格式。
在子线程中发送Message的方法也很简单,新建Message,设置好属性,调用myhandler.sendMessage()把Message作为参数,这样就发送出去了。也很简单,但是写Thread的话有时候会各种粗心(忘了写.start()等~。~),如果需要修改UI界面,还是建议使用AsyncTask。