1.在要实现异步任务的Activity需要继承AsyncTask类
public abstract class AsyncTask<Params, Progress, Result>
Params “启动任务执行的输入参数”
Progress “后台任务执行的进度”、
Result “后台计算结果的类型”。
在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
2.实现需要的方法
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组件上。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:
- doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
- onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:
- onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
- onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
- onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:
- Task的实例必须在UI thread中创建;
- execute方法必须在UI thread中调用;
- 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
- 该task只能被执行一次,否则多次调用时将会出现异常;
下面举一个简单的例子实现简单的功能。
假设有一个方法是需要联网查询远程的数据库中有没有相应的记录,如 TestLogin(username,password),成功返回true。现在用异步来实现用户登陆的功能。
在登陆界面的Activity中内嵌一个继承AsyncTask的类。因为这里要传入username,password,传出true,所以应该这样写:
private class APITestTask extends AsyncTask<String, Void, Object> {
protected Object doInBackground(String... params) {
// TODO Auto-generated method stub
Object object = TestFunction.testLogin(getApplicationContext(), params[0], params[1]);
return object;
}
protected void onPostExecute(Object result) {
if(result.equals("true")){
Log.i("login_testinfo", "loginsucessfully");
//跳转到登陆成功后的界面
}
}
对登陆按钮添加下面的时间监听:
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
EditText username = (EditText)findViewById(R.id.username_edit);
EditText password = (EditText)findViewById(R.id.password_edit);
EditText place = (EditText)findViewById(R.id.place_edit);
//Log.i("username", username.getText().toString());
//Log.i("password", password.getText().toString());
APITestTask login = new APITestTask();
login.execute(username.getText().toString(),password.getText().toString());
}
});
}
当单击登陆按钮时,
APITestTask的一个实例被创建,
execute方法启动后台线程的执行,这是代码跳转到doInBackground执行,接收
execute
传来的username,password属性,
doInBackground执行完成之后,自动执行onPostExecute方法,doInBackground的结果被返回到result中作为本方法的传入值,在这个方法中就可以根据返回的结果做进一步的操作。