网上找了很多关于Android在后台进行数据操作,界面显示进度条资料时,发现90%网上的博客、资料都是相同的内容,没有一点实质性的可用代码,真怀疑大家都是抄袭的API Demo中的。现在正好也用到在Android客户端提交数据量大的Http请求,想通过在提交服务器,并在处理时显示进度条,以及处理完后接收返回的结果,根据界面修改主线程UI界面。把相关代码贴出来供大家参考.
在Android SDK1.5以上,Android SDK为我们提供了一个后台任务的处理工具AsyncTask。AsyncTask就是一个封装过的后台任务类顾名思义就是异步任务,方便我们维护。要使用AsyncTask工作我们要提供三个泛型参数,并至少重载一个方法。
现在主要介绍下参数以及相关方法:
泛型参数:
Param ,任务执行器需要的数据类型
Progress 后台计算中使用的进度单位数据类型
Result 后台计算返回结果的数据类型
如果有些参数是可以设置为不使用的,只要传递为Void型即可,比如Progress
方法:
onPreExecute(),执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。
doInBackground(Params...),后台进程执行的具体计算在这里实现,doInBackground(Params...)是AsyncTask的关键,此方法必须重载。
onProgressUpdate(Progress...),运行于UI线程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值,此方法也要经常重载。
AsyncTask类主要的东西就这些了,下面给出一个代码示例:
- public class ProcessApplyActivity extends Activity
- {
- private Button mButton1;
- private TextView mTextView1;
- private int operation;
- public ProgressDialog myDialog = null;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.submitapply);
- Bundle bundle = this.getIntent().getExtras();
- CardApplyResquest request = (CardApplyResquest)bundle.getSerializable("cardrequest");
- operation = bundle.getInt("operation");
- mButton1 =(Button) findViewById(R.id.myButton1);
- mTextView1 = (TextView) findViewById(R.id.myTextView1);
- mButton1.setOnClickListener(myShowProgressBar);
- final CharSequence strDialogTitle = getString(R.string.str_dialog_title);
- final CharSequence strDialogBody = getString(R.string.str_dialog_body);
- // 显示对话框进度条
- myDialog = ProgressDialog.show
- (
- ProcessApplyActivity.this,
- strDialogTitle,
- strDialogBody,
- true
- );
- // 后台进行Http Request处理
- new SubmitApplyTask().execute(request);
- }
- private OnClickListener myShowProgressBar = new OnClickListener()
- {
- @Override
- public void onClick(View arg0)
- {
- Intent intent = new Intent();
- intent.setClass(ProcessApplyActivity.this, MainActivity.class);
- startActivity(intent);
- ProcessApplyActivity.this.finish();
- }
- };
- /**
- * 创建一个提交Http请求的异步任务
- * @author li.yiqun
- *CardApplyResquest:需要处理的数据类型
- *Void:第二个参数,不需要,定义为Void
- *Integer:返回结果类型为Integer
- */
- private class SubmitApplyTask extends AsyncTask<CardApplyResquest,Void,Integer>
- {
- @Override
- protected Integer doInBackground(CardApplyResquest... params)
- {
- CardApplyService service = new CardApplyService();
- return service.submit(params[0],operation);
- }
- @Override
- protected void onPostExecute(Integer result)
- {
- myDialog.dismiss();
- if(result == 200)
- {
- mTextView1.setText("申请资料提交成功");
- }
- else
- {
- mTextView1.setText("申请资料提交出错");
- }
- mButton1.setVisibility(0);
- }
- }
- }