久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Android之多線程工作

 昵稱7806402 2011-09-27

Android之多線程工作-AsyncTask與handler

分類: Android 330人閱讀 評論(0) 收藏 舉報

本文章主要講解下AsyncTask的使用以及Hnadler的應用,。

首先,,我們得明確下一個概念,什么是UI線程,。顧名思義,,ui線程就是管理著用戶界面的那個線程!

android的ui線程操作并不是安全的,,并且和用戶直接進行界面交互的操作都必須在ui線程中進行才可以,。這種模式叫做單線程模式,。我們在單線程模式下編程一定要注意:不要阻塞ui線程,、確保只在ui線程中訪問ui組件。

當我們要執(zhí)行一個復雜耗時的算法并且最終要將計算結(jié)果反映到ui上時,,我們會發(fā)現(xiàn),,我們根本沒辦法同時保證上面的兩點要求;我們肯定會想到開啟一個新的線程,,讓這個復雜耗時的任務到后臺去執(zhí)行,,但是執(zhí)行完畢了呢?我們發(fā)現(xiàn),,我們無法再與ui進行交互了,。

為了解決這種情況,,android為我們提供了很多辦法。

1),、handler和message機制:通過顯示的拋出,、捕獲信息與ui進行交互;

2),、Activity.runOnUiThread(Runnable):如果當前線程為ui線程,,則立即執(zhí)行;否則,,將參數(shù)中的線程操作放入到ui線程的事件隊列中,,等待執(zhí)行。

3),、View.post(Runnable):將操作放入到message隊列中,,如果放入成功,該操作將會在ui線程中執(zhí)行,,并返回true,,否則返回false

4)、View.postDelayed(Runnable,long)跟第三條基本一樣,,只不過添加了一個延遲時間,。

5)、android1.5以后為我們提供了一個工具類來搞定這個問題AsyncTask.

AsyncTask是抽象類.AsyncTask定義了三種泛型類型 Params,,Progress和Result,。

Params 啟動任務執(zhí)行的輸入?yún)?shù),比如HTTP請求的URL

Progress 后臺任務執(zhí)行的百分比,。

Result 后臺執(zhí)行任務最終返回的結(jié)果,,比如String

用程序調(diào)用,開發(fā)者需要做的就是實現(xiàn)這些方法,。

1) 子類化AsyncTask

2) 實現(xiàn)AsyncTask中定義的下面一個或幾個方法

onPreExecute(), 該方法將在執(zhí)行實際的后臺操作前被UI thread調(diào)用,。可以在該方法中做一些準備工作,,如在界面上顯示一個進度條,。

doInBackground(Params…), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運行在后臺線程中,。這里將主要負責執(zhí)行那些很耗時的后臺計算工作,。可以調(diào)用 publishProgress方法來更新實時的任務進度,。該方法是抽象方法,,子類必須實現(xiàn)。

onProgressUpdate(Progress…),在publishProgress方法被調(diào)用后,,UI thread將調(diào)用這個方法從而在界面上展示任務的進展情況,,例如通過一個進度條進行展示,。

onPostExecute(Result), 在doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI thread調(diào)用,,后臺的計算結(jié)果將通過該方法傳遞到UI thread.

為了正確的使用AsyncTask類,,以下是幾條必須遵守的準則:

1) Task的實例必須在UI thread中創(chuàng)建

2) execute方法必須在UI thread中調(diào)用

3) 不要手動的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)這幾個方法

4) 該task只能被執(zhí)行一次,,否則多次調(diào)用時將會出現(xiàn)異常

  1. package cn.com.chenzheng_java;  
  2.    
  3. import android.os.AsyncTask;  
  4. /** 
  5.  *  
  6.  * @author chenzheng_java 
  7.  * @description 異步任務AcyncTask示例 
  8.  *     
  9.  */  
  10. public class MyAsyncTask extends AsyncTask<String, Integer, Object> {  
  11.    
  12.  /** 
  13.  * 該方法由ui線程進行調(diào)用,,用戶可以在這里盡情的訪問ui組件。 
  14.  * 很多時候,,我們會在這里顯示一個進度條啥的,,以示后臺正在 
  15.  * 執(zhí)行某項功能。 
  16.  */  
  17.  @Override  
  18.  protected void onPreExecute() {  
  19.  super.onPreExecute();  
  20.  }  
  21.    
  22.  /** 
  23.  * 該方法由后臺進程進行調(diào)用,,進行主要的耗時的那些計算,。 
  24.  * 該方法在onPreExecute方法之后進行調(diào)用。當然在執(zhí)行過程中 
  25.  * 我們可以每隔多少秒就調(diào)用一次publishProgress方法,,更新 
  26.  * 進度信息 
  27.  */  
  28.  @Override  
  29.  protected Object doInBackground(String... params) {  
  30.  return null;  
  31.  }  
  32.    
  33.    
  34.  /** 
  35.  * doInBackground中調(diào)用了publishProgress之后,,ui線程就會 
  36.  * 調(diào)用該方法。你可以在這里動態(tài)的改變進度條的進度,,讓用戶知道 
  37.  * 當前的進度,。 
  38.  */  
  39.  @Override  
  40.  protected void onProgressUpdate(Integer... values) {  
  41.  super.onProgressUpdate(values);  
  42.  }  
  43.    
  44.  /** 
  45.  * 當doInBackground執(zhí)行完畢之后,由ui線程調(diào)用,??梢栽谶@里 
  46.  * 返回我們計算的最終結(jié)果給用戶。 
  47.  */  
  48.  @Override  
  49.  protected void onPostExecute(Object result) {  
  50.  super.onPostExecute(result);  
  51.  }  
  52. }  

 

下面介紹最本質(zhì)的多線程:hanlder和message機制:

為何需要多線程:

在日常應用中,,我們通常需要處理一些“后臺,,用戶不可見”的操作,例如說,,我們需要下載一個音樂,,要是你的應用必須等用戶下載完成之后才可以進行別的操 作,那肯定讓用戶非常的不爽,。這時候,,我們通常的做法是,讓這些操作去后臺執(zhí)行,,然后等后臺執(zhí)行完畢之后,,再給用戶彈出相應的提示信息,。這時候,,我們就需 要使用多線程機制,然后通過創(chuàng)建一個新的線程來執(zhí)行這些操作,。

明白了,,實現(xiàn)需求,,我們就準備著手實現(xiàn)了。但是,,經(jīng)過進一步的了解,,我們悲劇的發(fā)現(xiàn),android中的線程機制是,,只能在UI線程中和用戶進行交互,。當 我們創(chuàng)建了一個新線程,執(zhí)行了一些后臺操作,,執(zhí)行完成之后,,我們想要給用戶彈出對話框以確認,但是卻悲劇的發(fā)現(xiàn),,我們根本無法返回UI主線程了,。

(說明:何為UI線程:UI線程就是你當前看到的這些交互界面所屬的線程)。

這時候,,我們?nèi)绻胍獙崿F(xiàn)這些功能,,我們就需要一個android為我們提供的handler和message機制。

先講解下編程機制:

我們通常在UI線程中創(chuàng)建一個handler,,handler相當于一個處理器,,它主要負責處理和綁定到該handler的線程中的message。每一 個handler都必須關(guān)聯(lián)一個looper,,并且兩者是一一對應的,,注意,這點很重要哦,!此外,,looper負責從其內(nèi)部的messageQueue中 拿出一個個的message給handler進行處理。因為我們這里handler是在UI線程中實現(xiàn)的,,所以經(jīng)過這么一個handler,、 message機制,我們就可以回到UI線程中了,。

何為handler:處理后臺進程返回數(shù)據(jù)的工作人員,。

何為message:后臺進程返回的數(shù)據(jù),里面可以存儲bundle等數(shù)據(jù)格式

何為messageQueue:是線程對應looper的一部分,,負責存儲從后臺進程中拋回的和當前handler綁定的message,,是一個隊列。

何為looper:looper相當于一個messageQueue的管理人員,,它會不停的循環(huán)的遍歷隊列,,然后將符合條件的message一個個的拿出來交給handler進行處理。

注意,,handler是在UI線程中聲明的,,如果我們直接用類似代碼執(zhí)行一個線程的話,,實際上并沒有創(chuàng)建一個新的線程,因為handler已經(jīng)跟默認的UI線程中的looper綁定了,。

如果有興趣的話,,可以去看下Handler的默認空構(gòu)造函數(shù)便知道愿意了,里面直接綁定了當前UI線程的looper,。

下面給出一個比較簡單,,并且實用的實例。

  1. package cn.com.src;  
  2.    
  3. import cn.com.chenzheng_java.utils.R;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.os.Handler;  
  7. import android.os.HandlerThread;  
  8. import android.os.Looper;  
  9. import android.os.Message;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14.    
  15. /** 
  16.  * @author chenzheng_java 
  17.  * handler和message測試用例 
  18.  */  
  19. public class HanlderMessageTest extends Activity implements OnClickListener{  
  20.  Button button ;  
  21.  MyHandler handler ;  
  22.    
  23.  @Override  
  24.  protected void onCreate(Bundle savedInstanceState) {  
  25.  super.onCreate(savedInstanceState);  
  26.  setContentView(R.layout.main);  
  27.  button = (Button) this.findViewById(R.id.button1);  
  28.  button.setOnClickListener(this);  
  29.    
  30.    
  31.    
  32.  }  
  33.    
  34.  // 聲明自己的handler  
  35.  private class MyHandler extends Handler{  
  36.  /** 
  37.  * 使用默認的構(gòu)造函數(shù),,會將handler綁定當前UI線程的looper,。 
  38.  * 如果想使用多線程這里是不能使用默認的構(gòu)造方法的。 
  39.  */  
  40.  public MyHandler() {  
  41.  super();  
  42.  }  
  43.    
  44.  public MyHandler(Looper looper){  
  45.  super(looper);  
  46.  }  
  47.    
  48.  // 處理具體的message,該方法由父類中進行繼承.  
  49.  @Override  
  50.  public void handleMessage(Message msg) {  
  51.  int whatNumber = msg.what;  
  52.  Bundle bundle = (Bundle)msg.obj;  
  53.  Log.i("what", whatNumber+"");  
  54.  Log.i("名稱", bundle.getString("name"));  
  55.  Log.i("性別", bundle.getString("sex"));  
  56.  Log.i("年齡", bundle.getString("age"));  
  57.  super.handleMessage(msg);  
  58.  }  
  59.  }  
  60.   
  61.  // 我自定義的任務,一般都會實現(xiàn)Runnable  
  62.  private class MyThread implements Runnable {  
  63.  /** 
  64.  * 該方法的內(nèi)部進行具體的任務實現(xiàn),,比如 下載. 
  65.  * Message中包含著想和ui線程交互的數(shù)據(jù),,原則上,在線程內(nèi)部是 
  66.  * 最好不要直接調(diào)用handler的,。 
  67.  * */  
  68.  @Override  
  69.  public void run() {  
  70.    
  71.  try {  
  72.  Thread.sleep(6000);  
  73.  Message message = Message.obtain(handler);  
  74.  message.what = 10 ;  
  75.  Bundle bundle = new Bundle();  
  76.  bundle.putString("name""chenzheng");  
  77.  bundle.putString("sex""純爺們");  
  78.  bundle.putString("age""生卒年不詳");  
  79.  message.obj = bundle ;  
  80.  Log.i("通知""開始發(fā)message了哦");  
  81.  Log.i("通知thread_id:"""+Thread.currentThread().getId());  
  82.  message.sendToTarget();  
  83.  } catch (Exception e) {  
  84.  Log.i("通知""線程sleep時出錯了,!");  
  85.  e.printStackTrace();  
  86.  }  
  87.  }  
  88.  }  
  89.    
  90.  @Override  
  91.  public void onClick(View v) {  
  92.  Log.i("通知thread_id:"""+Thread.currentThread().getId());  
  93.    
  94.  // 創(chuàng)建一個包含Looper的線程,這里如果沒有HandlerThread的調(diào)用,,會直接將后邊的MyThread放到UI線程隊列  
  95.  HandlerThread myHandlerThread = new HandlerThread("chenzheng_java");  
  96.  // 啟動新線程  
  97.  myHandlerThread.start();  
  98.  // 將handler綁定到新線程  
  99.  handler = new MyHandler(myHandlerThread.getLooper());  
  100.  // 在新線程中執(zhí)行任務   
  101.  handler.post(new MyThread());  
  102.  }  
  103. }  

轉(zhuǎn)載聲明: 本文轉(zhuǎn)自

Android之多線程工作-AsyncTask與handler

Android自用-----AsyncTask實現(xiàn)異步處理任務

android線程 Handler Message Queue AsyncTask

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多