android异步处理有两种方法:一种是Thread+Handler;另一种是使用android提供的异步处理类AsyncTask。
一、Thread+Handler方法的使用方法大致如下:
- 创建Handler对象,并重写其handleMessage(Message)方法。
private ProgressDialog pd; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what == LOAD_DATA_COMPLEMENT_CODE){ initComponent(); pd.dismiss(); } } };
- 创建一个非UI线程在它的run方法中执行耗时操作,执行完耗时操作后再使用Handler对象更新UI线程。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.website_query); /*初始化*/ /*注:使用线程需注意不能在非主线程中操作UI组件*/ new Thread(){ @Override public void run() { loadData();//耗时操作 /*数据加载完后通知初始化UI组件*/ Message msg = new Message(); msg.what = LOAD_DATA_COMPLEMENT_CODE; handler.sendMessage(msg); } }.start(); pd = new ProgressDialog(this); pd.setTitle("数据加载中,请稍后..."); pd.show(); }
- 二、使用AsyncTash类的使用方法为:
private class InitData extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { Log.e(TAG," AsyncTask doInBackground() was called here....."); SelectFlightCityActivity.citiesList = loadCityData(); return null; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); Log.e(TAG," AsyncTask onPreExecute() was called here....."); } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Log.e(TAG," AsyncTask onPostExecute() was called here....."); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Intent intent = new Intent(InitActivity.this, MainActivity.class); startActivity(intent); finish(); } }
- 2、AsyncTask的onProgressUpdate()方法可以用来更新进度条。onProgressUpdate()方法在doInbackground()方法中调 用publishProgress()方法后调用,如下:
-
@Override protected Bitmap doInBackground(String... params) {//处理后台执行的任务,在后台线程执行 publishProgress(0);//将会调用onProgressUpdate(Integer... progress)方法 HttpClient hc = new DefaultHttpClient(); publishProgress(30); HttpGet hg = new HttpGet(params[0]);//获取csdn的logo final Bitmap bm; try { HttpResponse hr = hc.execute(hg); bm = BitmapFactory.decodeStream(hr.getEntity().getContent()); } catch (Exception e) { return null; } publishProgress(100); //mImageView.setImageBitmap(result); 不能在后台线程操作ui return bm; } protected void onProgressUpdate(Integer... progress) {//在调用publishProgress之后被调用,在ui线程执行 mProgressBar.setProgress(progress[0]);//更新进度条的进度 }
我在这里写得很简单,这里有几篇文章对Handler和AsyncTask有详细的描述: http://www.linuxidc.com/Linux/2011-09/43146.htm