题记:搞了半年的所谓J2EE开发,现在重新加入Droid的前端开发。很多东西都忘记了,现在一个个复习起上来。第一个当然要复习AsyncTask的用法。
AsyncTask主要方法的梳理:
执行次序 | 执行时机 | 方法名称 | 调用方 |
1 | 异步任务执行前 | onPreExecute | UI线程 |
2 | 异步任务执行中 | doInBackground | 后台线程 |
3 | 异步任务执行中 | publishProgress | 后台线程 |
4 | 异步任务执行中 | onProgressUpdate | UI线程 |
5 | 异步任务执行后 | onPostExecute | UI线程 |
UI线程(MainActivity.java):
启动AsyncTask。
package com.example.asynctaskexample; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ProgressBar; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ProgressBar myProgressBar=(ProgressBar)findViewById(R.id.progress_horizontal); /** * 启动异步任务,并传入"Begin","End"值演示UI线程向后端线程传值的情况 */ new MyAsyncTask(myProgressBar, getApplicationContext()).execute("Begin","End"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
定义异步线程的处理逻辑
package com.example.asynctaskexample; import android.content.Context; import android.os.AsyncTask; import android.os.Debug; import android.util.Log; import android.widget.ProgressBar; import android.widget.Toast; /** * AsyncTask<Params, Progress, Result> * * Params定义传入异步任务的参数类型。如本例就是,String * 传入异步任务的参数,由UI线程调用execute()方法传入,由后台线程调用doInBackground()方法获取 * * Progress定义异步任务执行过程中UI线程与后台线程之间传递的参数的类型。如本例就是,Integer * 后台线程调用publishProgress()方法并传入参数,UI线程调用onProgressUpdate()方法并获取参数值 * * Result定义异步任务执行结束后,后台线程向UI线程反馈执行结果时传递的参数类型。如本例就是,String * 后台线程执行doInBackground()方法结束后,通过返回值向UI线程反馈执行结果,UI线程调用onPostExecute()方法 * 并通过参数获取反馈结果 */ public class MyAsyncTask extends AsyncTask<String, Integer, String> { /** * 各常用方法使用时机: * * 执行次序 执行时机 方法名称 调用方 *1 异步任务执行前 onPreExecute UI线程 *2 异步任务执行中 doInBackground 后台线程 *3 异步任务执行中 publishProgress 后台线程 *4 异步任务执行中 onProgressUpdate UI线程 *5 异步任务执行后 onPostExecute UI线程 * */ /** * MainActivity的进度条 */ ProgressBar myprogressbar=null; /** * MainActivity的上下文 */ Context mycontext=null; public MyAsyncTask(ProgressBar progressbar,Context context) { // TODO Auto-generated constructor stub myprogressbar=progressbar; mycontext=context; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); myprogressbar.setProgress(0); Toast.makeText(mycontext,"进度条开始加载...",Toast.LENGTH_SHORT).show(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub String ret=null; /** * 通过Begin,End演示多参数传值 */ String Begin=params[0]; String End=params[1]; Log.d("Kaiwii_Test", Begin); /** * 模拟耗时步骤 */ for(int i=0;i<10;i++){ /** * 后台线程向UI线程发布进度状态i */ publishProgress(i); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Log.d("Kaiwii_Test", End); ret="更新完毕……"; return ret; } /** * UI线程通过参数result获得后端线程执行doInBackground()后的返回值 */ @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); Toast.makeText(mycontext,result,Toast.LENGTH_SHORT).show(); //myprogressbar.setProgress(myprogressbar.getMax()); } @Override /** * UI线程从后端线程获取状态值values,并且 UI线程根据状态值values * 更新进度条状态 */ protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); int progress=myprogressbar.getMax()/10*(values[0]+1); Log.d("Kaiwii_Test", "Progress"+progress); myprogressbar.setProgress(progress); } }