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

android AsyncTask 总结

2015-11-12 10:19 375 查看
总结自:

TitleLink
Android多线程之AsyncTask/article/4903171.html
从源码解析AsyncTask/article/1562136.html
AsyncTask,异步任务,可以简单进行异步操作,并把执行结果发布到UI主线程。AsyncTask是一个抽象类,
它的内部其实也是结合了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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: