Welcome 微信登录

首页 / 操作系统 / Linux / Android线程模型和AsyncTask

Android 的线程模型:当一个 android 的应用运行后, 就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图事件,它同样是用户与 android 控件 交互的线程。比如,当你在屏幕上的 EditText 上输入文字, UI 线程会把这个事件分发给刚输入文字的 EditText ,紧接会向事件队列发送一个更新 ( invalidate )请求。 UI 线程会把这个请求移出事件队列并通知 EditText 在屏幕上重新绘制自身。这种单线线程模型就会使得 android 的应用程序性能低下, 如果在这个单线程里执行一些耗时的操作, 比如访问数据库, 或是从网络端下载图片, 就会会阻塞整个用户界面。 比如如下操作:Bitmap b =  loadImageFromNetwork();这个操作非常耗时, 在这种情况下你会发现 , 界面僵死在那里并且 android 在系统 5 秒中后没有反应,会显示一个关闭或等待的错误。也许我们可以使用一个新的 Thread 来解决它
  1. new Thread(new Runnable() {     
  2.                  public void run() {                            
  3.                          Bitmap b = loadImageFromNetwork();       
  4.                         mImageView.setImageBitmap( b );       
  5.                  }     
  6.              }).start();   
<!-- [if gte mso 9]> Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE <![endif]--><!-- [if gte mso 9]> <![endif]--><!-- [if gte mso 10]><![endif]-->但这样会发生一些很难察觉的错误, 因为我们知道 UI 线程不是线程安全的。当然有很多种方法来处理这个问题:
android 提供了几种在其他线程中访问 UI 线程的方法。
? Activity.runOnUiThread( Runnable )
? View.post( Runnable )
? View.postDelayed( Runnable, long )
? Hanlder  
  1. new Thread( new Runnable() {       
  2.             public void run() {       
  3.                      final Bitmap b = loadImageFromNetwork();       
  4.                      mImageView.post( new Runnable() {       
  5.                      mImageView.setImageBitmap( b );       
  6. });       
  7.           }       
  8. }).start();  
<!-- [if gte mso 9]> Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE <![endif]--><!-- [if gte mso 9]> <![endif]--><!-- [if gte mso 10]><![endif]-->这种方法比较繁琐,同时当你需要实现一些很复杂的操作并需要频繁地更新UI 时这会变得更糟糕。为了解决这个问题,android 提供了一个工具类:AsyncTask ,它使创建需要与用户界面交互的长时间运行的任务变得更简单。<!-- [if gte mso 9]> Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE <![endif]--><!-- [if gte mso 9]> <![endif]--><!-- [if gte mso 10]><![endif]-->       就拿加载网络图片举个例子:
  1. ublic class CanvasImageTask extends AsyncTask<ImageView, Void, Bitmap>{   
  2.         private ImageView gView ;   
  3.            
  4.     protected Bitmap doInBackground(ImageView... views) {   
  5.                 Bitmap bmp = null ;   
  6.                 ImageView view = views[0];   
  7.             // 根据iconUrl获取图片并渲染,iconUrl的url放在了view的tag中。   
  8.             if (view.getTag() != null) {   
  9.                     try {   
  10.                        URL url = new URL(view.getTag().toString());   
  11.                        HttpURLConnection conn = (HttpURLConnection)url.openConnection();   
  12.                        conn.setDoInput(true);   
  13.                        conn.connect();   
  14.                        InputStream stream = conn.getInputStream();   
  15.                        bmp = BitmapFactory.decodeStream(stream);   
  16.                        stream.close();   
  17.                     } catch (Exception e) {   
  18.                                 Log.v("img", e.getMessage());   
  19.                             return null;   
  20.                     }   
  21.             }   
  22.             this.gView = view;   
  23.             return bmp;   
  24.     }   
  25.     protected void onPostExecute(Bitmap bm) {   
  26.             if (bm != null) {   
  27.                     this.gView.setImageBitmap(bm);   
  28.                     this.gView = null ;   
  29.             }   
  30.     }   
  31.        
  32. }   
  33. 在Activity中直接调用   
  34. if(!img.isDrawingCacheEnabled() || !holder.image.getTag().equals(imgpath)){   
  35.                 img.setImageResource(R.drawable.icon_app);   
  36.                 img.setTag(imgpath);   
  37.                 try{   
  38.                     new CanvasImageTask().execute(img);   
  39.                     img.setDrawingCacheEnabled(true);   
  40.                 }catch (Exception e) {   
  41.                     Log.e("error""RejectedExecutionException in content_img: " +  imgpath);  
<!-- [if gte mso 9]> Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE <![endif]--><!-- [if gte mso 9]>
版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图