首页 > 代码库 > android异步类AsyncTask的简单使用

android异步类AsyncTask的简单使用

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中创建。

   不要主动调用任何接口方法。