在Android开发中,经常要用到一些联网等长时间的操作,如果直接顺序执行的话,界面会暂时黑屏并卡死,这样给用户的体验并不好,这里我们可以用后台异步任务来实现这些操作。用eclipse新建Activity的时候,选择LoginActivity模版,会自动生成有登录操作的异步任务模版。
我们在执行后台任务时,弹出一个进度框ProgressDialog,给用户提供一种更好的体验:
1 ProgressDialog progress = new ProgressDialog(this);
2 progress.setMessage("Please wait ...");
我们要执行的后台任务通过继承AsyncTask类来实现,并重写doInBackground、onPostExecute两个方法,doInBackground方法执行后台任务,onPostExecute方法为任务执行后处理。AsyncTask类的详细介绍可参考官方文档:http://developer.android.com/reference/android/os/AsyncTask.htm。
1 class LoginTask extends AsyncTask<Void, Void, Boolean> {
2
3 @Override
4 protected Boolean doInBackground(Void... args) {
5 // 要执行的后台任务,登录、联网查询等。。。
6 return true;
7 }
8
9 @Override
10 public void onPostExecute(Boolean result) {
11 task = null;
12 progress.dismiss();
13
14 if (result) {
15 Toast.makeText(LoginActivity.this, "Success .", Toast.LENGTH_LONG).show();
16 } else {
17 Toast.makeText(LoginActivity.this, "Failed !", Toast.LENGTH_LONG).show();
18 }
19 }
20 }
在AsyncTask中,第一个Void是参数的类型,如果在执行任务的时候需要传递参数,可以改变这个类型,相应的doInBackground的参数类型也要改变;第二个Void是任务执行的进度,可以根据这个值控制进度条的提示;第三个Boolean是后台任务执行的返回结果,这里使用Boolean类型,根据返回的true/false判断任务是否执行成功,如果需要修改则onPostExecute方法的参数也要相应修改。
在界面控件的单击事件中添加对任务的调用:
1 button.setOnClickListener(new OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 if(task != null) {
5 Toast.makeText(LoginActivity.this, "Task is running ...", Toast.LENGTH_LONG).show();
6 return ;
7 }
8 progress.show();
9 task = new LoginTask();
10 task.execute((Void) null);
11 }
12 });
这样一来,点击按钮的时候会弹出一个进度框,并新建异步任务并执行,在执行过程中根据抛出的异常及其他条件判断返回true/false,在onPostExecute方法设置任务为空、进度框消失,根据任务执行结果执行后续相应处理。
我们在执行后台任务时,弹出一个进度框ProgressDialog,给用户提供一种更好的体验:
1 ProgressDialog progress = new ProgressDialog(this);
2 progress.setMessage("Please wait ...");
我们要执行的后台任务通过继承AsyncTask类来实现,并重写doInBackground、onPostExecute两个方法,doInBackground方法执行后台任务,onPostExecute方法为任务执行后处理。AsyncTask类的详细介绍可参考官方文档:http://developer.android.com/reference/android/os/AsyncTask.htm。
1 class LoginTask extends AsyncTask<Void, Void, Boolean> {
2
3 @Override
4 protected Boolean doInBackground(Void... args) {
5 // 要执行的后台任务,登录、联网查询等。。。
6 return true;
7 }
8
9 @Override
10 public void onPostExecute(Boolean result) {
11 task = null;
12 progress.dismiss();
13
14 if (result) {
15 Toast.makeText(LoginActivity.this, "Success .", Toast.LENGTH_LONG).show();
16 } else {
17 Toast.makeText(LoginActivity.this, "Failed !", Toast.LENGTH_LONG).show();
18 }
19 }
20 }
在AsyncTask中,第一个Void是参数的类型,如果在执行任务的时候需要传递参数,可以改变这个类型,相应的doInBackground的参数类型也要改变;第二个Void是任务执行的进度,可以根据这个值控制进度条的提示;第三个Boolean是后台任务执行的返回结果,这里使用Boolean类型,根据返回的true/false判断任务是否执行成功,如果需要修改则onPostExecute方法的参数也要相应修改。
在界面控件的单击事件中添加对任务的调用:
1 button.setOnClickListener(new OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 if(task != null) {
5 Toast.makeText(LoginActivity.this, "Task is running ...", Toast.LENGTH_LONG).show();
6 return ;
7 }
8 progress.show();
9 task = new LoginTask();
10 task.execute((Void) null);
11 }
12 });
这样一来,点击按钮的时候会弹出一个进度框,并新建异步任务并执行,在执行过程中根据抛出的异常及其他条件判断返回true/false,在onPostExecute方法设置任务为空、进度框消失,根据任务执行结果执行后续相应处理。