AsyncTask
来源:互联网 发布:苹果电脑设计绘图软件 编辑:程序博客网 时间:2024/05/29 18:56
1.AsyncTask是什么?
AsyncTask是android提供的轻量级的异步类,可以实现异步操作,把耗时的操作方法非主线程中去完成。
2.AsyncTask的引入有什么意义?
非主线程无法完后更新UI 的操作,只能通过Handler通信,发送消息通知主线程更新UI。而为了简化操作,实现在子线程中更新UI,Android为我们提供了封装好的一个类AsyncTask。(为啥称为封装好的类,是因为我们只要在主线程中声明并实例化这个类就可以了,无需调用方法与发送消息更新UI,系统自动调用)
3.AsyncTask的组成有哪些?
参数:
AsyncTask<Params,Progress,Result>
是一个抽象类,通常用于继承,所以继承AsyncTask需要指定如下三个泛型参数。
Params: 启动任务时输入参数的类型。
Progress: 后台任务 执行中返回进度值的类型。
Result: 后台执行任务完成后返回结果的类型。
方法:
实现AsyncTask有4个步骤,每一个步骤对应一种返回方法.onPreExecute() 该方法在可以做一些准备工作,被主线程调用,可以更新UI。可以不用实现。
doInBackground() 执行耗时操作,并通过调用 publishProgress方法来更新实时的任务进度(该方法是抽象方法,必须实现)
onPostExecute() 在doInBackground 执行完成后,自动将值传入onPostExecute 方法,而该方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户。
onCancelled() 在用户取消线程操作时调用,在主线程中调用。
4.注意事项
1.必须在UI线程中创建AsyncTask的实例。
2.必须在UI线程中调用AsyncTask的execute()方法(开启线程)。
3.重写的四个方法是系统自动调用的,不应该手动调用。
4.每一AsyncTask只能执行一次,多次执行就会出现异常(异常表现在于你多次执行后,2次执行之后不会立即出现线程的执行效果,原因是底层是依据线程池操作的,当之前的线程没执行完时,会继续执行,所以要想多次执行,则要调用onCancelled())。
5.在AsyncTask中,只有doinbackground方法是运行在子线程的,而其他的方法是运行在主线程的。所以在其他方法中的都可以更新UI,而在doinbackground方法中可以异步处理的,但不可以更新UI.
5.例子
private ProTask task; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressbar=(ProgressBar) findViewById(R.id.progressBar1); task=new ProTask(); task.execute(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if(task!=null&&task.getStatus()==task.getStatus().RUNNING){ task.cancel(true);//仅仅使用这个方法是不够的,//因为这只是标志了该线程为撤销的状态,所以还要进行后续的判断。才能消除异常。 } } class ProTask extends AsyncTask<Void, Integer, Void>{ @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub for(int i=0;i<100;i++){ if(task.isCancelled()){ break; } publishProgress(i); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); if(task.isCancelled()){ return; } progressbar.setProgress(values[0]); } }
- AsyncTask
- ASyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- Android基础入门教程——9.2 MediaPlayer播放音频与视频
- 如何绑定PasswordBox控制中的Password属性
- 浅谈容量规划
- Codeforces Round #326 (Div. 1) B Duff in Beach
- 汇编语言-直接定址表
- AsyncTask
- Ubuntu下使用vsftpd配置FTP服务器
- Objection 一个轻量级的Objective-C依赖注入框架
- 点滴记录——Ubuntu 14.04中gedit打开文件出现中文乱码问题
- 三种方法实现:三人表决器-20151104
- MapKit大头针的基本使用
- Ubuntu 12.04编译mt6582错误 - Tracy Mcgrady的专栏 - 博客频道 - CSDN.NET awk: line 4: function strtonum never def
- <React: Up and Running>阅读笔记 — The life of a component & Excel: a fancy table component
- ——黑马程序员——OC中的分类(Category)总结