android技術(shù)部分相關(guān)線程模式_第1頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Android 線程模型當(dāng)?shù)谝淮螁右粋€Android 程序時,Android 會自動創(chuàng)建一個稱為“main”主線程的線程。這個主線程(也稱為 UI 線程)很重要,因為它負責(zé)把事件分派到相應(yīng)的控件,其中就包括屏幕繪圖事件,它同樣是用戶與 Andriod 控件交互的線程。比如,當(dāng)你在屏幕上按下一個按鈕后,UI 線程會把這個事件分發(fā)給剛按得那個按鈕,緊接著按鈕設(shè)置它自身為被按下狀態(tài)并向事件隊列發(fā)送一個無效(invalidate)請求。UI 線程會把這個請求移出事件隊列并通知按鈕在屏幕上重新繪制自身。單線程模型會在沒有考慮到它的影響的情況下引起 Android 應(yīng)用程序性能低下,因為所有的任務(wù)都在同

2、一個線程中執(zhí)行,如果執(zhí)行一些耗時的操作,如網(wǎng)絡(luò)或查詢數(shù)據(jù)庫,會阻塞整個用戶界面。當(dāng)在執(zhí)行一些耗時的操作的時候,不地分發(fā)事件,包括用戶界面重繪事件。從用戶的角度來看,應(yīng)用程序看上去像掛掉了。更糟糕的是,如果阻塞應(yīng)用程序的時間過長(現(xiàn)在大概是 5 秒鐘)Android 會向用戶提示一些信息,即打開一個“應(yīng)用程序沒有相應(yīng)(application not responding)”的框。如果你想知道這有多糟糕,寫一個簡單的含有一個按鈕的程序,并為按鈕一個單擊事件,并在事件處理器中調(diào)用這樣的代碼Thread.sleep(2000)。在按下這個按鈕這后恢復(fù)按鈕的正常狀態(tài)之前,它會保持按下狀態(tài)大概 2 秒鐘。

3、如果這樣的情況在你編寫的應(yīng)用程序中發(fā)生,用戶的第一反應(yīng)就是你的程序運行很慢?,F(xiàn)在你知道你應(yīng)該避免在UI 線程中執(zhí)行耗時的操作,你很有可能會在線程或工作者線程中執(zhí)行這些耗時的任務(wù),這一副并使用 ImageView 來展現(xiàn)這幅圖樣做是否正確呢?讓來看一個例子,在這個例子中按鈕的單擊事件從網(wǎng)絡(luò)上片。代碼如下:view sourcepr ?1 public void onClick( View v ) 23456789 new Thread(new Runnable() public void run() Bitmap b = loadImageFromNetwork(); mImageView.se

4、tImageBitmap( b );).start();這段代碼好像很好地解決了你遇到,因為它不會阻塞 UI 線程。很不幸,它違背了單線程模型:Android UI 操作并不是線程安全的并且這些操作必須在UI 線程中執(zhí)行。在這段代碼片段中,在一個工作者線程中使用 ImageView 的方法,這回引起一些很古怪。查處這個問題并修復(fù)這個 bug 會很而且也很耗時。Andriod 提供了幾種在其他線程中UI 線程的方法?;蛟S你已經(jīng)對其中的一些方式很熟悉,但下面是一個更全面的列表:Activity.runOnUiThread( Runnable ) View.t( Runnable ) View.tD

5、elayed( Runnable, long ) Hanlder上面的任何一個類或方法都可以修復(fù)前面代碼中出現(xiàn)。view sourcepr ?01 public void onClick( View v ) 02030405060708091011 new Thread(new Runnable() public void run() final Bitmap b = loadImageFromNetwork(); mImageView.t( new Runnable() mImageView.setImageBitmap( b ););).start();很不幸的是這些類或方法同樣會使你的代

6、碼很復(fù)雜很難理解。然而當(dāng)你需要實現(xiàn)一些很復(fù)雜的操作并需要頻繁地更新 UI時這會變得更糟糕。為了解決這個問題,Android 1.5 提供了一個工具類:Asynk,它使創(chuàng)建需要與用戶界面交互的長時間運行的任務(wù)變得更簡單。在Android 1.0 和 1.1 中具有與Asyn代碼拷貝的你的程序中。k 相同功能的類UserTask。它提供了完全一樣的 API,你需要做的只是把它的Asynk 的目標(biāo)是替你管理你的線程。前面的代碼可以很容易地使用 Asynk 重寫。view sourcepr ?01 public void onClick( View v ) 02new DownloadImageTas

7、k().execute( /image.png );03 private class DownloadImageTask extends Asynk 04050607080910protected BitmapnBackground( String. urls ) return loadImageFormNetwork( urls0 );protected void ontExecute( Bitmap result ) mImageView.setImageBitmap( result );正如你看到的,使用 Asynk 必須要繼承它。使用 Asynk 非常重要的是:Asynk 的實例必須在

8、UI 線程中創(chuàng)建而且只能被使用一次。你可以使用預(yù)讀Asynk 的文檔來來了解如何使用這個類,下面大概地了解一下它是如何工作的:你可以使用泛型參數(shù)制定任務(wù)的參數(shù)、中間值(progress values)和任何的最終執(zhí)行結(jié)果nBackground()方自動地在工作者線程中執(zhí)行 onPreExecute()、ontExecute()和onProgrepdate()方在UI 線程中被調(diào)用nBackground()方法的返回值會被傳遞給ontExecute()方法 在nBackground()方法中你可以調(diào)用publishProgress()方法,每一次調(diào)用都會使UI 線程執(zhí)行一次onProgrepdate()方法 你可以在任何時候任何線程中取消這個任務(wù)除了的文檔,你可以閱讀Shelves 和Photostream 源代碼中的幾個復(fù)雜的示例。我強烈地碼,它會使你知道如何在配置更改之間持久化任務(wù)以及在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論