您的位置:首页 > 移动开发 > Android开发

Android- AsyncTask 总结

2015-09-05 21:43 387 查看
1.回顾

   上篇学习了 Android的 Handler  的知识和 异步更新 UI的操作;

2.重点

  (1)AsyncTask 介绍

  (2)AsyncTask 参数

  (3)AsyncTask 重写的方法

  (4)AsyncTask 与 Handler 

3.AsyncTask 介绍

    (1)AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作;

    (2)为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的;

   (3)AsyncTask和Handler 均可 处理 异步任务

   (4)AsyncTask 直接继承与 Object ,android.os.AsyncTask

   注意:

     (1)Task的实例必须在UI thread中创建;

     (2)execute方法必须在UI thread中调用;

     (3)不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;

     (4)该task只能被执行一次,否则多次调用时将会出现异常;

  

    

4.AsyncTask 参数

(1)Params 启动任务执行的输入参数,比如HTTP请求的URL。
(2)Progress 后台任务执行的百分比。
(3)Result 后台执行任务最终返回的结果,比如String。

5.AsyncTask
重写的方法

(1) doInBackground(Params…,Progress,Result) 
 
     后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务

的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。

(2) onPostExecute(Result)  

     相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主

线程执行,任务执行的结果作为此方法的参数返回;

(3) onProgressUpdate(Progress…)   

    可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。

(4) onPreExecute()       

    这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。

(5) onCancelled()     
       
   用户调用取消时,要做的操作

6.Handler 与 AsyncTask

     (1)  AsyncTask 使用起来 简单 ,快捷,过程可以控制;

     (2) AsyncTask 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来;

     (3)  Handler 实现 通过 子线程 进行异步操作,后通过
Message 封装消息,handler执行 更新UI的变更;

     (4) Hander 使用起来 结构清晰,功能定义明确
;  对于多个后台任务时,简单,清晰
;

     (5) 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

7. 代码示例

    AsyncTask 多个 Map 参数 ,传递实现;

class upimgdataAsyncTask extends
AsyncTask<Map<String, String>, Void, String> {

@Override
protected String doInBackground(Map<String, String>... params) {
//执行异步任务
String url = "http://192.168.75.1:8080/UploadEmo/UploadImage";
UrlConnPostdata postdata = new UrlConnPostdata(url, params[0],
params[1]);
String result = postdata.connPost();
return result;
}

@Override
protected void onPostExecute(String result) {
//返回结果
textView1.setText("结果:" + result);
}

}

   调用:
    Map 数组 实现:

Map<String, String>[] maps = new Map[2];
maps[0] = new HashMap<String, String>();
maps[0].put("name", "Yuan");
maps[0].put("pass", "LABELNET");

maps[1] = new HashMap<String, String>();
maps[1].put("file", getSmallImage("/test.jpg"));

upimgdataAsyncTask asyncTask = new upimgdataAsyncTask();
asyncTask.execute(maps);

 8.总结 
   不管是 AsyncTask 还是 Handler ,都均可 实现
异步加载数据,更新UI操作;用的时候,看习惯;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息