Android开发:后台异步任务之AsyncTask实现

在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 }
LoginActivity.java

 

转载于:https://www.cnblogs.com/ChrisJY/p/3173633.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值