工程中读取书签历史的数据时采用异步机制。在Android中,如果涉及网络编程或者某些极耗资源的操作的时候,必然会出现操作时间久的情况,而Android中不能在ui线程中进行过于耗时的操作,不然会出现“强制关闭,等待”的提示信息。在android中有两种异步处理方式,一是Thread与Handler结合,二是AsyncTask。
使用asynctask类和使用标准线程机制
Asynctask提供一些抽象类的方法,能使用户在不用创建线程的情况下管理后台操作。
它提供了以下方法:
obPreExecute() 运行于ui进程,用于进入后台操作前的操作
doInBackGround()运行后台操作
publishProgress()周期性通知UI线程有关后台操作的进度
onPostExecute() 后台操作完成后,调用此方法
public class ProAT extends AsyncTask<String, Integer, String> {
/*
* 第一个参数为doInBackground传入的参数,
* 第二个参数为onProgressUpdate传入参数,由doInBackground内调用publishProgress
* (Interger)传值; 第三个为doInBackground返回值和onPostExecute传入的参数。
*/
@Override
protected void onPreExecute() {
// 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上转菊花提示
System.out.println("onPreExecute--->Task start");
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
// 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。
// 这里将主要负责执行那些很耗时的后台计算工作。
System.out.println("doInBackground---->");
try {
Thread.sleep(5000);
// 可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
publishProgress(1);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
return "doInBackground";
}
@Override
protected void onProgressUpdate(Integer... values) {
System.out.println("更新进度" + values[0]);
// 在publishProgress方法被调用后,UI
// thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
// 在doInBackground 执行完成后,onPostExecute 方法将被UI
// thread调用,后台的计算结果将通过该方法传递到UI thread
// 用于更新UI
update();
System.out.println("onPostExecute----->" + result);
super.onPostExecute(result);
}
@Override
protected void onCancelled() {
// 当用户取消操作时.
super.onCancelled();
}
}