AsyncTask的用法
来源:互联网 发布:java导出文件到桌面 编辑:程序博客网 时间:2024/06/05 15:58
一个异步任务的执行一般包括以下几个步骤:
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;
}
}
}
- AsyncTask 的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法(转)
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- Android AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- AsyncTask的用法
- editText设置背景后,被软键盘覆盖
- Linux下统计当前文件夹下的文件个数、目录个数
- HDU-1686 Oulipo(kmp模板题)
- caffe中的layers
- hdu 3842 Machine Works
- AsyncTask的用法
- 二叉树的建立与遍历
- 商人的诀窍
- R第三问 Rstudio server 安装
- 【HDU 1422】重温世界杯(DP)
- poj 2109 Power of Cryptography
- CodeForces 630C
- 12. Integer to Roman
- Android之用jadx进行反编译