您的位置:首页 > 其它

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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asynctask 异步