android异步处理的几种方式 

1,对数据库uri查询的异步方式----AsyncQueryHandler 
示例 
首先写一个AsyncQueryHandler继承类QueryHandler,然后 
new一个mQueryHandler对象。查询完了之后会回调onQueryComplete函数,如下: 
    Java代码  
  1. private void query() {    
  2.         
  3.             Uri uri = Sms.CONVESATION_URI;    
  4.         
  5.             mQueryHandler.startQuery(0null, uri, CONVERSATION_PROJECTION, nullnull"sms.date desc");    
  6.         
  7.         }    
  8.         
  9.         // 写一个异步查询类    
  10.         
  11.         private final class QueryHandler extends AsyncQueryHandler {    
  12.         
  13.             public QueryHandler(ContentResolver cr) {    
  14.         
  15.                 super(cr);    
  16.         
  17.             }    
  18.         
  19.          
  20.         
  21.             @Override    
  22.         
  23.             protected void onQueryComplete(int token, Object cookie, Cursor cursor) {    
  24.         
  25.                 super.onQueryComplete(token, cookie, cursor);    
  26.         
  27.                 // 更新mAdapter的Cursor    
  28.         
  29.                 mAdapter.changeCursor(cursor);    
  30.         
  31.             }    
  32.         
  33.         }    


2,使用Thread+Handler实现非UI线程更新UI界面 
示例如下: 
Java代码  
  1. public class ThreadHandlerActivity extends Activity {    
  2.     /** Called when the activity is first created. */    
  3.         
  4.     private static final int MSG_SUCCESS = 0;//获取图片成功的标识    
  5.     private static final int MSG_FAILURE = 1;//获取图片失败的标识    
  6.         
  7.     private ImageView mImageView;    
  8.     private Button mButton;    
  9.         
  10.     private Thread mThread;    
  11.         
  12.     private Handler mHandler = new Handler() {    
  13.         public void handleMessage (Message msg) {//此方法在ui线程运行    
  14.             switch(msg.what) {    
  15.             case MSG_SUCCESS:    
  16.                 mImageView.setImageBitmap((Bitmap) msg.obj);//imageview显示从网络获取到的logo    
  17.                 Toast.makeText(getApplication(), getApplication().getString(R.string.get_pic_success), Toast.LENGTH_LONG).show();    
  18.                 break;    
  19.     
  20.             case MSG_FAILURE:    
  21.                 Toast.makeText(getApplication(), getApplication().getString(R.string.get_pic_failure), Toast.LENGTH_LONG).show();    
  22.                 break;    
  23.             }    
  24.         }    
  25.     };    
  26.         
  27.     @Override    
  28.     public void onCreate(Bundle savedInstanceState) {    
  29.         super.onCreate(savedInstanceState);    
  30.         setContentView(R.layout.main);    
  31.         mImageView= (ImageView) findViewById(R.id.imageView);//显示图片的ImageView    
  32.         mButton = (Button) findViewById(R.id.button);    
  33.         mButton.setOnClickListener(new OnClickListener() {    
  34.                 
  35.             @Override    
  36.             public void onClick(View v) {    
  37.                 if(mThread == null) {    
  38.                     mThread = new Thread(runnable);    
  39.                     mThread.start();//线程启动    
  40.                 }    
  41.                 else {    
  42.                     Toast.makeText(getApplication(), getApplication().getString(R.string.thread_started), Toast.LENGTH_LONG).show();    
  43.                 }    
  44.             }    
  45.         });    
  46.     }    
  47.         
  48.     Runnable runnable = new Runnable() {    
  49.             
  50.         @Override    
  51.         public void run() {//run()在新的线程中运行    
  52.             HttpClient hc = new DefaultHttpClient();    
  53.             HttpGet hg = new HttpGet("http://csdnimg.cn/www/images/csdnindex_logo.gif");//获取csdn的logo    
  54.             final Bitmap bm;    
  55.             try {    
  56.                 HttpResponse hr = hc.execute(hg);    
  57.                 bm = BitmapFactory.decodeStream(hr.getEntity().getContent());    
  58.             } catch (Exception e) {    
  59.                 mHandler.obtainMessage(MSG_FAILURE).sendToTarget();//获取图片失败    
  60.                 return;    
  61.             }    
  62.             mHandler.obtainMessage(MSG_SUCCESS,bm).sendToTarget();//获取图片成功,向ui线程发送MSG_SUCCESS标识和bitmap对象    
  63.     
  64. //          mImageView.setImageBitmap(bm); //出错!不能在非ui线程操作ui元素    
  65.     
  66. //          mImageView.post(new Runnable() {//另外一种更简洁的发送消息给ui线程的方法。    
  67. //                  
  68. //              @Override    
  69. //              public void run() {//run()方法会在ui线程执行    
  70. //                  mImageView.setImageBitmap(bm);    
  71. //              }    
  72. //          });    
  73.         }    
  74.     };    
  75.         
  76. }    

3,使用AsyncTask异步更新UI界面 
AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数: 

1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。 

2、正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。 

3. 进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。 

4. 完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。 

5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用 

示例代码: 
Java代码  
  1. public class AsyncTaskActivity extends Activity {    
  2.         
  3.     private ImageView mImageView;    
  4.     private Button mButton;    
  5.     private ProgressBar mProgressBar;    
  6.         
  7.     @Override    
  8.     public void onCreate(Bundle savedInstanceState) {    
  9.         super.onCreate(savedInstanceState);    
  10.         setContentView(R.layout.main);    
  11.             
  12.         mImageView= (ImageView) findViewById(R.id.imageView);    
  13.         mButton = (Button) findViewById(R.id.button);    
  14.         mProgressBar = (ProgressBar) findViewById(R.id.progressBar);    
  15.         mButton.setOnClickListener(new OnClickListener() {    
  16.                 
  17.             @Override    
  18.             public void onClick(View v) {    
  19.                 GetCSDNLogoTask task = new GetCSDNLogoTask();    
  20.                 task.execute("http://csdnimg.cn/www/images/csdnindex_logo.gif");    
  21.             }    
  22.         });    
  23.     }    
  24.         
  25.     class GetCSDNLogoTask extends AsyncTask {//继承AsyncTask    
  26.     
  27.         @Override    
  28.         protected Bitmap doInBackground(String... params) {//处理后台执行的任务,在后台线程执行    
  29.             publishProgress(0);//将会调用onProgressUpdate(Integer... progress)方法    
  30.             HttpClient hc = new DefaultHttpClient();    
  31.             publishProgress(30);    
  32.             HttpGet hg = new HttpGet(params[0]);//获取csdn的logo    
  33.             final Bitmap bm;    
  34.             try {    
  35.                 HttpResponse hr = hc.execute(hg);    
  36.                 bm = BitmapFactory.decodeStream(hr.getEntity().getContent());    
  37.             } catch (Exception e) {    
  38.                     
  39.                 return null;    
  40.             }    
  41.             publishProgress(100);    
  42.             //mImageView.setImageBitmap(result); 不能在后台线程操作ui    
  43.             return bm;    
  44.         }    
  45.             
  46.         protected void onProgressUpdate(Integer... progress) {//在调用publishProgress之后被调用,在ui线程执行    
  47.             mProgressBar.setProgress(progress[0]);//更新进度条的进度    
  48.          }    
  49.     
  50.          protected void onPostExecute(Bitmap result) {//后台任务执行完之后被调用,在ui线程执行    
  51.              if(result != null) {    
  52.                  Toast.makeText(AsyncTaskActivity.this"成功获取图片", Toast.LENGTH_LONG).show();    
  53.                  mImageView.setImageBitmap(result);    
  54.              }else {    
  55.                  Toast.makeText(AsyncTaskActivity.this"获取图片失败", Toast.LENGTH_LONG).show();    
  56.              }    
  57.          }    
  58.              
  59.          protected void onPreExecute () {//在 doInBackground(Params...)之前被调用,在ui线程执行    
  60.              mImageView.setImageBitmap(null);    
  61.              mProgressBar.setProgress(0);//进度条复位    
  62.          }    
  63.              
  64.          protected void onCancelled () {//在ui线程执行    
  65.              mProgressBar.setProgress(0);//进度条复位    
  66.          }    
  67.             
  68.     }    
  69.         
  70.     
  71. }    

下面是对应的xml 
Xml代码  
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical" android:layout_width="fill_parent"    
  4.     android:layout_height="fill_parent">    
  5.     <ProgressBar android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal">ProgressBar>    
  6.     <Button android:id="@+id/button" android:text="下载图片" android:layout_width="wrap_content" android:layout_height="wrap_content">Button>    
  7.     <ImageView android:id="@+id/imageView" android:layout_height="wrap_content"    
  8.         android:layout_width="wrap_content" />    
  9. LinearLayout>   


具体的AsyncTask的实现原理可以参考 
http://blog.csdn.net/mylzc/article/details/6774131 

另外对于handler机制的详细解析,可以参考下面 
http://blog.csdn.net/mylzc/article/details/6771331

更多相关文章

  1. Android(安卓)菜单详解
  2. Android主流Router库对比(ARouter、ActivityRouter)
  3. android 锁屏界面处理
  4. android 多线程 AsyncTask handler
  5. 2020年 Android必会面试题
  6. Android(安卓)Binder机制学习总结(二)-Driver部分
  7. Android从零开始(二)
  8. Android热插拔事件处理流程--Vold
  9. IPC与Binder,Binder线程池,AIDL demo - Android

随机推荐

  1. 看动画轻松理解「 堆 」
  2. 图解 LeetCode 第 642 号问题:搜索自动完
  3. 【图解数据结构】一组动画彻底理解堆排序
  4. 动画:什么是散列表?
  5. 每周一算:Move Zeros
  6. 2019,Done is better than perfect
  7. 每天一算:Sort Colors
  8. 每天一算:Two Sum II
  9. RPA财务机器人的应用分类丨部署方式维度
  10. 每天一算:Minimum Size Subarray Sum