在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方法设置任务为空、进度框消失,根据任务执行结果执行后续相应处理。
全部代码:
1 public class LoginActivity extends Activity { 2 3 private Button button = null; 4 5 private ProgressDialog progress = null; 6 private LoginTask task = null; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_login); 12 13 progress = new ProgressDialog(this); 14 progress.setMessage("Please wait ..."); 15 16 button = (Button) findViewById(R.id.button); 17 button.setOnClickListener(new OnClickListener() { 18 @Override 19 public void onClick(View v) { 20 if(task != null) { 21 Toast.makeText(LoginActivity.this, "Task is running ...", Toast.LENGTH_LONG).show(); 22 return ; 23 } 24 progress.show(); 25 task = new LoginTask(); 26 task.execute((Void) null); 27 } 28 }); 29 } 30 31 class LoginTask extends AsyncTask<Void, Void, Boolean> { 32 33 @Override 34 protected Boolean doInBackground(Void... args) { 35 // 要执行的后台任务,登录、联网查询等。。。 36 return true; 37 } 38 39 @Override 40 public void onPostExecute(Boolean result) { 41 task = null; 42 progress.dismiss(); 43 44 if (result) { 45 Toast.makeText(LoginActivity.this, "Success .", Toast.LENGTH_LONG).show(); 46 } else { 47 Toast.makeText(LoginActivity.this, "Failed !", Toast.LENGTH_LONG).show(); 48 } 49 } 50 } 51 }