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;
}
}

}

0 0
原创粉丝点击