AsyncTask应用事例

1.引用

1 task = new GetPackageTask(getString(R.string.getting_softwarepackage));
2 task.execute();

2.具体

  1 class GetPackageTask extends AsyncTask<String, String, String> {
  2 
  3         public GetPackageTask(String toastMessages) {
  4             // TODO Auto-generated constructor stub
  5             toastMessage = toastMessages;
  6         }
  7         
  8         @Override
  9         protected void onPreExecute() {
 10             // TODO Auto-generated method stub
 11             super.onPreExecute();
 12         }
 13 
 14         @Override
 15         protected String doInBackground(String... params) {
 16             // 序列号is
 17             String serialNo = MySharedPreferences.getStringValue(mContext, MySharedPreferences.serialNoKey);
 18             ProductService softService = new ProductService();
 19             cc = MySharedPreferences.getStringValue(mContext, MySharedPreferences.CCKey);
 20             mToken = MySharedPreferences.getStringValue(mContext, MySharedPreferences.TokenKey);
 21             softService.setCc(cc);
 22             softService.setToken(mToken);
 23             try {
 24                 if (MainActivity.country == null || MainActivity.country.length() <= 0) {
 25                     Locale locale = Locale.getDefault();
 26                     MainActivity.country = locale.getCountry();
 27                     //判断下特殊手机
 28                     String country = locale.getCountry();
 29                     String language = locale.getLanguage();
 30                     if(language.equalsIgnoreCase("en")&&country.equalsIgnoreCase("CN")){
 31                         MainActivity.country = "other";
 32                     }
 33                 }
 34                 int lanId = AndroidToLan.getLanId(MainActivity.country);
 35                 // //Log.e("bcf", "lanId: " + lanId + " serialNo: " + serialNo);
 36                 if (lanId != 1002 && lanId != 1001) {// msd 缺省情况下用英文请求
 37                     lanId = 1001;
 38                 }
 39                 mPackageInfoResult = softService.getSoftPackageInfo(lanId, serialNo);
 40 //                aaa;
 41             } catch (SocketTimeoutException e) {
 42                 mHandler.obtainMessage(0).sendToTarget();
 43             } catch (NullPointerException e) {
 44                 mHandler.obtainMessage(1).sendToTarget();
 45             }
 46 
 47             return null;
 48         }
 49 
 50         @Override
 51         protected void onPostExecute(String result) {
 52             super.onPostExecute(result);
 53             mProgressBar.setVisibility(View.GONE);
 54             if (mPackageInfoResult != null) {
 55                 switch (mPackageInfoResult.getCode()) {
 56                 case -1:
 57                     SimpleDialog.validTokenDialog(mContext);
 58                     break;
 59                 case 401:
 60                     Toast.makeText(mContext, R.string.notic_null, Toast.LENGTH_SHORT).show();
 61                     break;
 62                 case 658:
 63                     Toast.makeText(mContext, R.string.package_null, Toast.LENGTH_SHORT).show();
 64                     break;
 65 
 66                 case 0:// 成功 删除旧数据
 67                     GoloMasterConstant.ifhaveCreatedOrder = false;
 68                     if (mSoftPackageList != null) {
 69                         mSoftPackageList.clear();
 70                     }
 71                     for (SoftPackageDto dto : mPackageInfoResult.getSoftPackageList()) {
 72                         
 73 //                        String softPackageID = "";
 74 //                        softPackageID = dto.getSoftPackageId()+"";
 75 //                        for(int k=0;k<dto.getPackageDetailList().size();k++){
 76 //                            dto.getPackageDetailList().get(k).setSoftPackageID(softPackageID);
 77 //                        }
 78                         
 79                         mSoftPackageList.add(dto);
 80                         if (mSoftPackageList != null && mSoftPackageList.size() > 0) {
 81                             sortList(mSoftPackageList);
 82                         }
 83                     }
 84                     
 85                     if(mSoftPackageList != null && mSoftPackageList.size() > 0){
 86                         show_no_soft_package.setVisibility(View.GONE); // 隐藏无软件包的提示
 87                         show_soft_package.setVisibility(View.VISIBLE); // 有软件包正常显示
 88                         if (mAdapter == null) {
 89                             mAdapter = new SoftPackAdapter(mContext, mSoftPackageList);
 90                             mPackageListView.setAdapter(mAdapter);
 91                         } else {
 92                             mAdapter.notifyDataSetChanged();
 93                         }
 94                     }else{
 95                         show_no_soft_package.setVisibility(View.VISIBLE); 
 96                         show_soft_package.setVisibility(View.GONE); 
 97                     }
 98                     
 99                     break;
100                 case 500:
101                     Toast.makeText(mContext, R.string.notic_serv, Toast.LENGTH_SHORT).show();
102                     break;
103                 case 793:
104                     if (mPackageInfoResult.getMessage() != null) {
105                         if (mPackageInfoResult.getMessage().contains("人民币")) {
106                             Toast.makeText(mContext, R.string.buy_softpackage_by_rmb, Toast.LENGTH_SHORT).show();
107                         } else {
108                             Toast.makeText(mContext, R.string.buy_softpackage_by_usd, Toast.LENGTH_SHORT).show();
109                         }
110                     }
111                     break;
112                 case 794:
113                     if (mPackageInfoResult.getMessage() != null) {
114                         if (mPackageInfoResult.getMessage().contains("人民币")) {
115                             Toast.makeText(mContext, R.string.buy_softpackage_by_rmb, Toast.LENGTH_SHORT).show();
116                         } else {
117                             Toast.makeText(mContext, R.string.buy_softpackage_by_usd, Toast.LENGTH_SHORT).show();
118                         }
119                     }
120                     break;
121                 default:
122                     break;
123                 }
124             } 
125         }
126 
127         @Override
128         protected void onCancelled() {
129             // TODO Auto-generated method stub
130             super.onCancelled();
131 
132         }

3.简述AsyncTask

AsyncTask定义了三种泛型类型 Params,Progress和Result。

  • Params 启动任务执行的输入参数,比如HTTP请求的URL。
  • Progress 后台任务执行的百分比。
  • Result 后台执行任务最终返回的结果,比如String。

使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

  • doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
  • onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

有必要的话你还得重写以下这三个方法,但不是必须的:

  • onProgressUpdate(Progress…)   可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
  • onPreExecute()        这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
  • onCancelled()             用户调用取消时,要做的操作

使用AsyncTask类,以下是几条必须遵守的准则:

  • Task的实例必须在UI thread中创建;
  • execute方法必须在UI thread中调用;
  • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
  • 该task只能被执行一次,否则多次调用时将会出现异常;
posted @ 2015-03-26 14:48  种花小哥  阅读(126)  评论(0)    收藏  举报