在开发Android应用时必须遵守单线程模型的原则.Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
在单线程模型中始终要记住两条法则:
1. 不要阻塞UI线程 (当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。)2. 确保只在UI线程中访问Android UI工具包
那么我们在UI线程显示的同时,又要并发的处理一些其他的数据或者操作时,怎么办?就需要用到Android1.5提供的一个工具类AsyncTask(异步任务)
使用方法:
1.要有一个类继承AsyncTask,在AsyncTask中会有三种泛型Params,Progress和Result,他们的作用分别是
Params ----> 任务执行器需要的数据类型,即启动任务执行的输入参数,
Progress---->后台计算中使用的进度单位,即后台执行任务的百分比
Result------->后台计算后返回结果的数据类型,也就是后台执行任务最终返回的结果的数据类型
实现例如:
class myAsyncTask extends AsyncTask<Params, Progress, Result>{
protected void onPreExecute() {
该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
}
protected ArrayList<Joke> doInBackground(String...params) {
将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任 务进度。该方法是抽象方法,子类必须实现。
return null;
}
protected void onPostExecute(ArrayList<Joke> result) {
在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
}
protected void onProgressUpdate(Void... values) {
在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
}
在使用时,这样用
private void loadData() {
myAsyncTask dataTask = new myAsyncTask ();
dataTask.execute(“”); //这里的参数就是第一个泛型的数据类型,也就是在doInBackground()方法中的输入参数
}
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。