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只能被执行一次,否则多次调用时将会出现异常;

浙公网安备 33010602011771号