freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第6章后臺服務(編輯修改稿)

2025-03-26 04:25 本頁面
 

【文章內(nèi)容簡介】 iew = (TextView)findViewById()。 11 Button bindButton = (Button)findViewById()。 12 Button unbindButton = (Button)findViewById()。 13 Button putButton = (Button)findViewById()。 14 // 先判斷是否服務綁定狀態(tài) , 如不是就用 bingService( ) 方法進行服務綁定 服務 Service的兩種使用方式 ? 以下是本例程中服務部分的關(guān)鍵代碼 , 重點看 onBind( ) 方法和public long Add( ) 方法: 10 public class MathService extends Service{ 11 private final IBinder mBinder = new LocalBinder()。 12 13 public class LocalBinder extends Binder{ 14 MathService getService() { 15 return 。 16 } 17 } 18 19 Override 20 public void onCreate() { 21 (this, (1) 調(diào)用 Oncreate()方法 , 22 ).show()。 23 ()。 24 } 25 服務 Service的兩種使用方式 26 Override 27 public int onStartCommand(Intent intent, int flags, int startId) { 28 (this, (2) 調(diào)用 onStartCommand方法 , 29 ).show()。 30 return (intent, flags, startId)。 31 } 32 //為了使 Service支持綁定 , 需要重載 onBind()方法 , 并返回 Service對象 33 Override 34 public IBinder onBind(Intent intent) { 35 (this, (3) 本地綁定: MathService, 36 ).show()。 37 return mBinder。 38 } 39 服務 Service的兩種使用方式 40 Override 41 public boolean onUnbind(Intent intent){ 42 (this, (4) 取消本地綁定: MathService, 43 ).show()。 44 return false。 45 } 46 Override 47 public void onDestroy() { 48 (this, (5) 調(diào)用 onDestroy()方法 , 49 ).show()。 50 ()。 51 } 52 public long Add(long a, long b){// 本公用方法是本服務的核心內(nèi)容 53 return a+b。 54 } 55 } 服務 Service的兩種使用方式 ? 當 Service被綁定時 , 系統(tǒng)會調(diào)用 onBind()函數(shù) , 通過onBind()函數(shù)的返回值 , 將 Service對象返回給調(diào)用者 。 ? 從第 34行代碼中可以看出 , onBind()函數(shù)的返回值必須是符合 IBinder接口的 , 所以在代碼中聲明一個接口變量mBinder, mBinder符合 onBind()函數(shù)返回值的要求 , 因此將 mBinder傳遞給調(diào)用者 , IBinder是用于進程內(nèi)部和進程間過程調(diào)用的輕量級接口 , 定義了與遠程對象交互的抽象協(xié)議 , 使用時通過繼承 Binder的方法實現(xiàn) 。 ? 第 13~16行代碼繼承 Binder, LocalBinder是繼承 Binder的一個內(nèi)部類 。 服務 Service的兩種使用方式 ? 第 14行代碼實現(xiàn)了 getService()函數(shù) , 當調(diào)用者獲取到mBinder后 , 通過調(diào)用 getService()即可獲取到 Service的對象 。 ? 第 52~54行代碼實現(xiàn)了公用方法 add()函數(shù) , 當調(diào)用者調(diào)用后 , 返回加法后的值 。 ? 本例程如果不使用服務模式 , 也是可以很方便的實現(xiàn)類似的功能 , 在這里通過服務綁定的模式來強調(diào)說明服務Service的使用方法 , 當讀者具體開發(fā)時 , 需實現(xiàn)的功能可以通過在服務中自定義的方法來代替現(xiàn)有的 add( ) 方法 。 服務 Service的兩種使用方式 在服務中使用新線程更新 UI ? 前一小節(jié)的兩個例程中的 Activity和 Service都是工作在主線程上的 , 可以理解為 UI線程 。 但是在操作一些耗時操作的情形時 , 比如 I/O讀寫的大文件讀寫 , 數(shù)據(jù)庫操作以及網(wǎng)絡下載需要很長時間 , 為了不阻塞用戶界面 , 出現(xiàn) ANR( Application Not Responding) 的響應提示窗口 , 如圖所示 , 用戶可以選擇 “ 等待 ” 而讓程序繼續(xù)運行 , 也可以選擇 “ 強制關(guān)閉 ” 。 ? 一個流暢的 、 合理的應用程序中不應該出現(xiàn) ANR, 而讓用戶每次都要處理這個對話框 。 因此 , 在程序里對響應性能的設計很重要 , 這樣系統(tǒng)不會顯示 ANR給用戶 。 默認情況下 , 在 Android中 Activity的最長執(zhí)行時間是 5秒 ,BroadcastReceiver的最長執(zhí)行時間則是 10秒 。 ? 因此 , 運行在主線程里的任何方法都盡可能少做事情 。 特別是 , Activity應該在它的關(guān)鍵生命周期方法 ( 如onCreate()和 onResume()) 里盡可能少的去做創(chuàng)建操作。 潛在的耗時操作 , 例如網(wǎng)絡或數(shù)據(jù)庫操作 , 或者高耗時的計算如改變位圖尺寸 , 應該在一個新的子線程里來完成, 主線程應該為子線程提供一個 Handler, 以便完成時能夠提交給主線程 。 以這種方式設計應用程序 , 將能保證主線程保持對輸入的響應性并能避免由于 5秒輸入事件的超時而引發(fā)的 ANR對話框問題 。 這樣本小節(jié)涉及兩個問題 ,如何創(chuàng)建一個新線程 Thread? 如何在子線程和主線程之間通過 Handler進行數(shù)據(jù)交互 ? 在服務中使用新線程更新 UI ? 創(chuàng)建和使用線程 Thread ? 線程 Thread,有時被稱為輕量級進程 (Lightweight Process, LWP),是程序執(zhí)行流的最小單元,線程是程序中一個單一的順序控制流程。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身,如果在單個程序中同時運行多個線程完成不同的工作,稱為多線程。 ? 在一個進程中的多個線程之間,可以并發(fā)執(zhí)行,這樣的機制下,可以認為子線程和主線程是相對獨立的,且能與主線程并行工作的程序單元,這樣可以把需要完成一些耗時、影響用戶體驗的子線程代碼放入后臺服務中,不需要界面、不需要用戶參與也能在后臺服務中完成一些如網(wǎng)絡更新、下載等工作。 在服務中使用新線程更新 UI ? 在 Android中創(chuàng)建和使用線程的方法和 Java編程一樣 , 首先需要實現(xiàn)Runnable接口 , 并重載 run( ) 方法 , 在 run( ) 方法中實現(xiàn)功能代碼。 1 private Runnable backgroudWork = new Runnable(){ 2 Override 3 public void run() { 4 //功能代碼 5 } 6 }。 ? 然后創(chuàng)建 Thread對象 , 并將上面實現(xiàn)的 Runnable對象作為參數(shù)傳遞給 Thread對象 。 Thread的構(gòu)造函數(shù)中 , 第 1個參數(shù)用來表示線程組;第 2個參數(shù)是需要執(zhí)行的 Runnable對象;第 3個參數(shù)是線程的名稱 。 1 private Thread workThread。 2 workThread = new Thread(null,backgroudWork,WorkThread)。 ? 最后調(diào)用 start( ) 方法啟動線程 。 1 ()。 在服務中使用新線程更新 UI ? 當線程在 run()方法返回后 , 線程就自動終止了 , 不推薦使用調(diào)用 stop()方法在外部終止線程 。 最好的方法是通知線程自行終止 , 一般調(diào)用 interrupt()方法通告線程準備終止, 線程會釋放它正在使用的資源 , 在完成所有的清理工作后自行關(guān)閉 。 1 ()。 ? 其實 interrupt()方法并不能直接終止線程 , 僅是改變了線程內(nèi)部的一個布爾字段 , run()方法能夠檢測到這個布爾字段 , 從而知道何時應該釋放資源和終止線程 。 在 run()方法的代碼 , 一般通過 ()方法查詢線程是否被中斷 , 以下代碼的功能是以 1秒為間隔進行循環(huán)執(zhí)行功能代碼并檢測線程是否被中斷 。 在服務中使用新線程更新 UI 1 public void run() { 2 try { 3 while(true){ 4 //過程代碼 5 (1000)。 6 } 7 } catch (InterruptedException e) { 8 ()。 9 } 10 } ? 第 5行代碼使線程休眠 1000毫秒 , 當線程在休眠過程中被中斷時 , 則會產(chǎn)生 InterruptedException, 并且在捕獲到 InterruptedException后 , 安全終止線程 。 在服務中使用新線程更新 UI ? 使用 Handle更新用戶界面 ? 現(xiàn)在讀者已經(jīng)能設計自己的線程了,但還存在一個問題,那就是如何使用后臺線程( Service)中的最新數(shù)據(jù)去更新用戶界面( Activity), Android系統(tǒng)提供了多種方法去解決這個問題,查閱文檔和 Apidemo后,常用的方法之一是利用 Handler來實現(xiàn) UI線程的更新功能, Handler來根據(jù)接收的消息,處理 UI更新。 Thread線程發(fā)出 Handler消息,通知更新 UI。 Android為開發(fā)者提供的 Handler和Message機制去實現(xiàn)這些功能,現(xiàn)在對相關(guān)編程機制進行說明。 在服務中使用新線程更新 UI ? 通常在 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線程中了 。 這里涉及的 4個概念下面再次進行說明: ? Handler:理解為工作人員 , 在主線程中為處理后臺進程返回數(shù)據(jù)的工作人員 。 ? Message:理解為需要傳遞的消息 , 就是后臺進程返回的數(shù)據(jù) , 里面可以存儲 bundle等數(shù)據(jù)格式 。 在服務中使用新線程更新 UI ? MessageQueue:理解為消息隊列 , 就是線程對應 Looper的一部分 , 負責存儲從后臺進程中拋回的和當前 Handler綁定的 Message, 是一個隊列 。 ? Looper:理解為一個 MessageQueue的管理人員 , 它會不停的循環(huán)遍歷隊列 , 然后將符合條件的 Message一個個的拿出來交給 Handler進行處理 。 ? Handler允許將 Runnable對象發(fā)送到線程的消息隊列中 ,每個 Handler對象綁定到一個單獨的線程和消息隊列上 ,當用戶建立一個新的 Handler對象 , 通過 post()方法將Runnable對象從后臺線程發(fā)送到 GUI線程的消息隊列中 ,當 Runnable對象通過消息隊列后 , 這個 Runnable對象將被運行 。 在服務中使用新線程更新 UI 1 private static Handler handler = new Handler()。// 產(chǎn)生一個新的 Handle對象 2 //通過系統(tǒng)的 post()方法將 Runnable對象從后臺線程發(fā)送到 GUI線程的消息隊列中 3 pub
點擊復制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1