第一种:AsyncTask
AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度,最后反馈执行结果给UI主线程。它比Handler更轻量级。
一个task实例只能调用一次。
AsyncTask提供了三种泛型参数,并重载至少一个方法。
三个参数:
parames:启动任务输入的参数,比如url等
progress:后台执行任务的百分比
result:后台执行任务最终返回的结果
几个方法:
doInBackground(params..):耗时的后台操作,这里不能进行ui主线程更新操作,可以用publishProgress来更新进度
onPostExecute(Result):类似于Handler中更新UI主线程
onProgressUpdate(Progress...):增加进度条,提高用户体验度
onCancelled():用户调用取消时要做的操作
优点:
简单,快捷
过程可控
缺点:
在使用多个异步操作并需要进行UI更新时就变得复杂起来
使用场景:
改善设计,少用异步,线程的开销是很大的
与主线程有交互时使用AsyncTask,否则用Thread即可
对于有需要大量线程执行任务时,一定要创作线程池
对于想要立即开始执行的异步任务,要么直接使用Thread,要么单独创建线程池提供给AsyncTask
1. task.executeOnExecutor(Executors.newCachedThreadPool()); 无限制线程池
2. Executors.newFixedThreadPool(7);最大值为7的线程池
3. Executors.newSingleThreadExecutor():单个线程的线程池
代码:
public class MyAsyncTask extends AsyncTask<Integer, Integer, String>
{
private ProgressBar progressBar;
public MyAsyncTask(ProgressBar progressBar)
{
super();
this.progressBar = progressBar;
}
@Override
protected String doInBackground(Integer... arg0)
{
int i = 0;
for (i = 0; i <= 100; i += 10)
{
try
{
Thread.sleep(300);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
publishProgress(i);
}
String result = (i - 10) + arg0[0].intValue() + "";
return result;
}
@Override
protected void onPostExecute(String result)
{
}
@Override
protected void onPreExecute()
{
}
@Override
protected void onProgressUpdate(Integer... values)
{
int value = values[0];
progressBar.setProgress(value);
}
}