android中AsyncTask类的使用
有时我们在主线程中需要做一些比较耗时的操作,例如:查询数据库、获取网络资源等等;如果在主线程中直接调用的话就会造成UI线程阻塞或界面很卡顿的情况,严重的时候可能会出现ANR,当然这时我们可以通过handler机制解决问题,但是handler内部也是通过开启一个内部线程,然后通知主线程更新UI,过多的子线程同样会影响UI主线程,所以android为我们提供了asyncTask类。
以下简单记录下AsyncTask类的用法,这个类定义了三种范型:params、progress、result,这三种参数分别在开始调用excute()、onProgressUpdate()以及onPostExcute()时传入,也就是在开始调用异步类,执行过程中,执行结束的时候传入。
AsyncTask中会使用到的方法:
1)excute(Params... params):需要执行异步类的时候调用;
2)onPreExecute():在执行doInBackground方法前可以做一些初始化的操作,设置控件的状态;
3)doInBackground(Params...params):耗时操作就是在这个方法中执行的;
4)publishProgress(Progress progress):在doInBackground的过程中可能涉及到一些进度问题,所以我们可以通过;publishProgress方法通知onProgressUpdate()方法更新进度;
5)onProgressUpdate(Progress... progress):接收publishProgress()方法发出的通知类更新进度;
6)onPostExecute(Result result):在doInBackground方法执行结束后,会有一个Result类型的返回值,onPostExecute接收到后通知主线程更新UI;
7)onCancelled():在用户取消线程操作的时候调用;在主线程中调用;
以下简单记录下AsyncTask类的用法,这个类定义了三种范型:params、progress、result,这三种参数分别在开始调用excute()、onProgressUpdate()以及onPostExcute()时传入,也就是在开始调用异步类,执行过程中,执行结束的时候传入。
AsyncTask中会使用到的方法:
1)excute(Params... params):需要执行异步类的时候调用;
2)onPreExecute():在执行doInBackground方法前可以做一些初始化的操作,设置控件的状态;
3)doInBackground(Params...params):耗时操作就是在这个方法中执行的;
4)publishProgress(Progress progress):在doInBackground的过程中可能涉及到一些进度问题,所以我们可以通过;publishProgress方法通知onProgressUpdate()方法更新进度;
5)onProgressUpdate(Progress... progress):接收publishProgress()方法发出的通知类更新进度;
6)onPostExecute(Result result):在doInBackground方法执行结束后,会有一个Result类型的返回值,onPostExecute接收到后通知主线程更新UI;
7)onCancelled():在用户取消线程操作的时候调用;在主线程中调用;
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常