AsyncTask的用法
2016-07-25 21:15
417 查看
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
public class MainActivity extends Activity implements OnClickListener {
Button start, stop;
TextView textview;
ProgressBar proBar;
int count;
progressAsnctask progressAsnctask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.textview);
proBar = (ProgressBar) findViewById(R.id.progressbar);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}
private class progressAsnctask extends AsyncTask<String, Integer, Integer> {
@Override
protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub
proBar.setMax(params.length);// 設置進度的最大值
count = params.length;
for (int i = 0; i < count; i++) {
publishProgress(i + 1);// 每次循環一次,更新一次进度,publishProgress方法的参数表示当前进度
if (isCancelled()) {
break;
}
try {
// 延迟两秒
Thread.sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
}
return params.length;
}
// 当任务完成时调用 onPostExecute方法,在该方法中可以访问 ui线程控件
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
show("任务完成,共处理" + result + "个值");
}
// 调用普遍历史progress 方法会导致onprogressupdate方法被调用
// 在该方法中更新ui线程控件
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
// 更新进度
proBar.setProgress(values[0]);
// 更新textview控件
textview.setText(100 * values[0] / count + "%");
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
show("任务已取消");
super.onCancelled();
}
}
public void show(String text) {
Toast.makeText(this, text, 2000).show();
}
public void onClick(View v) {
switch (v.getId()) {
// 开始控件点击事件
case R.id.start:
progressAsnctask = new progressAsnctask();
progressAsnctask.execute("st1", "str2", "str3", "str4", "str5");
break;
// 取消按钮事件
case R.id.stop:
progressAsnctask.cancel(true);
break;
default:
break;
}
}
}
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
public class MainActivity extends Activity implements OnClickListener {
Button start, stop;
TextView textview;
ProgressBar proBar;
int count;
progressAsnctask progressAsnctask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.textview);
proBar = (ProgressBar) findViewById(R.id.progressbar);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}
private class progressAsnctask extends AsyncTask<String, Integer, Integer> {
@Override
protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub
proBar.setMax(params.length);// 設置進度的最大值
count = params.length;
for (int i = 0; i < count; i++) {
publishProgress(i + 1);// 每次循環一次,更新一次进度,publishProgress方法的参数表示当前进度
if (isCancelled()) {
break;
}
try {
// 延迟两秒
Thread.sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
}
return params.length;
}
// 当任务完成时调用 onPostExecute方法,在该方法中可以访问 ui线程控件
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
show("任务完成,共处理" + result + "个值");
}
// 调用普遍历史progress 方法会导致onprogressupdate方法被调用
// 在该方法中更新ui线程控件
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
// 更新进度
proBar.setProgress(values[0]);
// 更新textview控件
textview.setText(100 * values[0] / count + "%");
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
show("任务已取消");
super.onCancelled();
}
}
public void show(String text) {
Toast.makeText(this, text, 2000).show();
}
public void onClick(View v) {
switch (v.getId()) {
// 开始控件点击事件
case R.id.start:
progressAsnctask = new progressAsnctask();
progressAsnctask.execute("st1", "str2", "str3", "str4", "str5");
break;
// 取消按钮事件
case R.id.stop:
progressAsnctask.cancel(true);
break;
default:
break;
}
}
}
相关文章推荐
- ruby实现的一个异步文件下载HttpServer实例
- C#异步绑定数据实现方法
- 科学知识:同步、异步、阻塞和非阻塞区别
- 探讨Ajax中同步与异步之间的区别
- C#中异步回调函数用法实例
- Android AsyncTask源码分析
- C#实现异步GET的方法
- C#异步下载文件
- C#异步执行任务的方法
- 简单实现C#异步操作
- 使用Promise解决多层异步调用的简单学习心得
- 深入理解JavaScript编程中的同步与异步机制
- Jquery异步提交表单代码分享
- Android中异步类AsyncTask用法总结
- JQuery异步获取返回值中文乱码的解决方法
- jQuery通过deferred对象管理ajax异步
- Highcharts使用简例及异步动态读取数据
- Ajax异步上传文件实例代码分享
- Node.js 的异步 IO 性能探讨
- Ajax异步(请求)提交类 支持跨域