Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务,更通俗地说就是一个执行后台任务的线程
而且他还会自动通知主线程更新UI
优点:
结构清晰,容易理解。
缺点
代码量稍大
下面直接看代码
1 private class AsyncLogin extends AsyncTask<Void,Integer,Boolean>{ 2 private EditText passwordEdit; 3 private EditText studentIdEdit; 4 public boolean isClose=false; //构造函数 5 public AsyncLogin(EditText passwordEdit, EditText studentIdEdit) { 6 super(); 7 this.passwordEdit = passwordEdit; 8 this.studentIdEdit = studentIdEdit; 9 } 10 11 private boolean checkResultCode(String code){ 12 String message=codeToResult.get(code); 13 if(dialog.isShowing()) 14 dialog.dismiss(); 15 if(message==null){ 16 return true; 17 }else{ 18 Toast.makeText(MainActivity.this, 19 message, 20 Toast.LENGTH_LONG).show(); 21 return false; 22 } 23 } 24 25 private void intentJump(){ 26 if(!isClose){ 27 Intent intent = new Intent(MainActivity.this,CourseListActivity.class); 28 intent.putExtra("sessionId", MainActivity.this.sessionId); 29 intent.putExtra("strUserName", this.studentIdEdit.getText().toString()); 30 MainActivity.this.startActivity(intent); 31 MainActivity.this.finish(); 32 } 33 } 34 //后台线程完成后调用此方法,在此方法中可以更新主线程UI 35 @Override 36 protected void onPostExecute(Boolean result) { 37 super.onPostExecute(result); 38 if(result){ 39 if(checkResultCode(MainActivity.this.sessionId)) 40 intentJump(); 41 }else{ 42 checkResultCode("000"); 43 } 44 } 45 //后台任务,主要完成工作量大的任务 46 @Override 47 protected Boolean doInBackground(Void... params) { 48 String sessionId=""; 49 50 51 try{ 52 Thread.sleep(5000); 53 sessionId = webService.CheckLogin( 54 this.studentIdEdit.getText().toString(), 55 this.passwordEdit.getText().toString()); 56 }catch(Exception e){ 57 e.printStackTrace(); 58 return false; 59 } 60 MainActivity.this.sessionId=sessionId; 61 return true; 62 } //开始执行前调用该方法 63 @Override 64 protected void onPreExecute() { 65 super.onPreExecute(); 66 dialog = new ProgressDialog(MainActivity.this); 67 dialog.setCancelable(true); 68 dialog.setMessage("正在登录,请等待.."); 69 dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 70 @Override 71 public void onCancel(DialogInterface dialog) { 72 if(asycLogin!=null) 73 asycLogin.cancel(true); 74 } 75 }); 76 dialog.show(); 77 } 78 }
new AsyncLogin(passwordEdit,studentIdEdit).execute();//开始任务
下面是接口方法
1、doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意不能直接操作UI。
2、onPostExecute(Result) 处理UI的方式,这里面可以使用在doInBackground 得到的结果处理操作UI。
3、onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
4、onPreExecute() 这当任务执行之前开始调用此方法,可以在这里显示进度对话框就好像上面代码一样。
5、onCancelled() 用户调用取消时,调用该方法
注意事项
AsynTask的实例必须在UI thread中创建。
不要主动调用任何接口方法。