android AsyncTask 总结
2015-11-12 10:19
375 查看
总结自:
AsyncTask,异步任务,可以简单进行异步操作,并把执行结果发布到UI主线程。AsyncTask是一个抽象类,
它的内部其实也是结合了Thread和Handler来实现异步线程操作,但是它形成了一个通用线程框架,更清晰简单。
AsyncTask应该被用于比较简短的操作(最多几秒钟)。如果需要保持长时间运行的线程,可以使用
ThreadPooExecutor或者FutureTask,关于这两个类的内容,以后再介绍,本片博客主要介绍AsyncTask。
AsyncTask被定义为一个操作,运行在一个后台线程中,其结果被发布在UI线程上。它的异步工作的参数与返
回值被泛型的三个参数指定:Params、Progress、Result。AsyncTask将经历4个步骤:
onPreExecute、doInBackground、onProgressUpdate、onPostExecute。
Params:被发送到执行任务的参数类型。
Progress:进度的类型,发送后台的计算进度到UI线程类型。
Result:异步任务的返回结果类型。
doInBackground(Params...):主要是用来执行异步任务的耗时操作,可以在这个方法中通过publishProgress()
方法发布进度信息,并在执行完成之后,返回执行结果。
onProgreddUpdate(Progress...):在UI线程上接受doInBackground()传递过来的进度信息,并在UI线程上展示
进度信息,它执行的时机是不确定的。
onPostExecute(Result):在UI线程上操作doInBackground()执行的返回值。
返回值,使其返回true。之后会调用onCancelled(Object)方法,替代onPostExecute()得到doInBackground()
的返回结果。在运行中,可以经常通过isCancelled()方法查看任务是否被取消。
AsyncTask必须在UI线程上实例化。
必须通过execute()方法执行任务。
不可以直接调用onPreExecute()、onPostExecute(Resut)、doInBackground(Params...)、onProgressUpdate(Progress...)方法。
可以设置任务只执行一次,如果企图再次执行会报错。
Title | Link |
---|---|
Android多线程之AsyncTask | /article/4903171.html |
从源码解析AsyncTask | /article/1562136.html |
它的内部其实也是结合了Thread和Handler来实现异步线程操作,但是它形成了一个通用线程框架,更清晰简单。
AsyncTask应该被用于比较简短的操作(最多几秒钟)。如果需要保持长时间运行的线程,可以使用
ThreadPooExecutor或者FutureTask,关于这两个类的内容,以后再介绍,本片博客主要介绍AsyncTask。
AsyncTask被定义为一个操作,运行在一个后台线程中,其结果被发布在UI线程上。它的异步工作的参数与返
回值被泛型的三个参数指定:Params、Progress、Result。AsyncTask将经历4个步骤:
onPreExecute、doInBackground、onProgressUpdate、onPostExecute。
三个参数:
Params:被发送到执行任务的参数类型。Progress:进度的类型,发送后台的计算进度到UI线程类型。
Result:异步任务的返回结果类型。
四个阶段:
onPreExecute():执行在UI线程上调用执行任务之前,一般用于设置任务。doInBackground(Params...):主要是用来执行异步任务的耗时操作,可以在这个方法中通过publishProgress()
方法发布进度信息,并在执行完成之后,返回执行结果。
onProgreddUpdate(Progress...):在UI线程上接受doInBackground()传递过来的进度信息,并在UI线程上展示
进度信息,它执行的时机是不确定的。
onPostExecute(Result):在UI线程上操作doInBackground()执行的返回值。
取消任务:
在程序的任何位置,都可以通过cancel(boolean)方法进行取消任务,当取消任务之后,会改变isCancelled()的返回值,使其返回true。之后会调用onCancelled(Object)方法,替代onPostExecute()得到doInBackground()
的返回结果。在运行中,可以经常通过isCancelled()方法查看任务是否被取消。
原则:
AsyncTask必须声明在UI线程上。AsyncTask必须在UI线程上实例化。
必须通过execute()方法执行任务。
不可以直接调用onPreExecute()、onPostExecute(Resut)、doInBackground(Params...)、onProgressUpdate(Progress...)方法。
可以设置任务只执行一次,如果企图再次执行会报错。
public class AsyncTaskActivity extends AppCompatActivity { Button asyncButton; ProgressBar progressBar; TextView asyncTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acitivity_asynctask); asyncButton=(Button)findViewById(R.id.asyncButton); progressBar=(ProgressBar)findViewById(R.id.asyncProgressBar); asyncTextView=(TextView)findViewById(R.id.asyncText); asyncButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //执行一个异步任务,execute 中的1000也就是 doinBackground 中的 params new MyAsynacTask().execute(1000); } }); } class MyAsynacTask extends AsyncTask<Integer,Integer,ArrayList<Integer>> { //执行任务前,一般用于配置任务 @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } //任务执行完毕,对UI进行操作 @Override protected void onPostExecute(ArrayList<Integer> integers) { super.onPostExecute(integers); asyncTextView.setText(integers.toString()); progressBar.setVisibility(View.GONE); } //在UI中更新任务进度 @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); progressBar.setProgress(values[0]); } //在另一个线程中执行异步任务,获取params[0]以内的所有质数 @Override protected ArrayList<Integer> doInBackground(Integer... params) { int len=params[0]; ArrayList<Integer>list=new ArrayList<>(); OK: for(int i=2;i<=len;i++) { int x=(int)Math.sqrt(i); for(int j=2;j<=x;j++) if(i%j==0) continue OK; //为了更直观的观看进度条变化,适当的让线程进入休眠 try { Thread.sleep(5); }catch (InterruptedException e){e.printStackTrace();} int progress=(int)(i*1.0/len*100); //向 onProgressUpdate 传递任务进度 publishProgress(progress); list.add(i); } return list; } } }
相关文章推荐
- android自定义数字软键盘、修改review按钮的样式
- android URL含进度条异步加载简单实例
- 《android 学习》三、Intent 的概念及应用
- Ant 打包全攻略
- Android的系统服务一览
- Android简洁漂亮的引导页
- 用android studio将assets打包到jar文件的方法
- 解决Android Studio中Terminal无法输入问题
- Android定位&地图&导航——基于百度地图实现的定位功能
- Android 原生listview item伸展收缩效果 (续)
- Android4.2 获取手机各种状态集合
- Android 中三种使用线程的方法
- AndroidManifest.xml文件详解(uses-feature)
- Android触摸屏事件派发机制详解与源码分析三(Activity篇)
- Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)
- Android触摸屏事件派发机制详解与源码分析一(View篇)
- Service
- Android Process 进程通信(一)
- Android4.2 第一次开机引导界面
- android 解决按钮、imageView 背景图片拉伸变大的问题