第一章、主線程與子線程

第一章、主線程與子線程


當咱們打開FBReader程序的一刻,代碼會當即建立一個子線程。以後,主線程會負責在屏幕上顯示一個進度條,而子線程則在後臺開始讀取epub文件。

    PS:進度條的樣子以下圖所示,不過因爲加載速度很快,這進度條都是一閃而過的。這張圖片是在單步調試的環境下截取的。 安全

在這一章,咱們將詳細介紹,程序如何建立子線程,以及如何控制進度條的顯示與消失。
本章涉及的核心類是UIUtil類。 app


FBReader默認首先進入的FBReader類,這是在AndroidManifes.xml設定的。 spa

ZLAndroidActivity類中的onCreate方法

    FBReader類的onCreate方法會首先觸發FBReader類的父類ZLAndroidActivity類中的onCreate方法。
      

    這個方法中進行了一系列的初始化工做:
    102行:設置程序爲全屏
    107行:設置程序的界面,這個界面是ViewZLAndroidWidget類。咱們會在第十章「epub文件處理 -- 顯示」中詳細分析這個類的onDraw方法。
    110行:調用ZLAndroidLibrary類的setActivity方法,爲ZLAndroidLibrary類裏面的myActivity變量賦了值(請你們記住這個方法,咱們立刻會用到這個變量)
    114行:調用FBReader類的createApplication方法,返回一個FBReaderApp類
    117行:調用FBReaderApp類的子類FBReaderApp中的initWindow方法,這個方法方法將負責創建子線程,並在主線程顯示進度條 線程

FBReaderApp類的initWindow方法、ZLAndroidApplicationWindow類wait方法

    FBReaderApp類的initWindow方法調用了ZLApplication類的wait方法。而ZLApplication類的wait方法又會最終調用ZLAndroidApplicationWindow類wait方法
    請記住initWindow方法中定義的Runnable類,這個類中的內容就是以後要在子線程中要運行的讀取epub文件的代碼。
    

    還記得剛纔要你們記住的ZLAndroidLibrary類的setActivity方法嗎?當時這個方法,給ZLAndroidLibrary類的myActivity變量賦了值。如今ZLAndroidLibrary類的wait方法會判斷這個屬性,如這個屬性爲null,就會直接在主線程中運行讀取epub文件的代碼(這樣可能會形成主線程中的UI產生停滯);若是這個屬性不爲null,就會調用UIUtil類的wai方法,分兩個線程處理程序 調試

    

UIUtil類wait方法

    在UIUtil類中的wait方法中,咱們能夠看到代碼新開了一個子線程(78行),子線程中運行的代碼是ZLApplication類的FBReaderApp類的initWindow方法中定義的Runnable類中的內容。同時,主線程調用ProgressBar類的show方法顯示了一個進度條(咱們會在下一章中詳細介紹如何得到進度條中要顯示的字)。


關於進度條,有兩個部分須要詳細介紹一下:第一是如何讓進度條消失,第二是如何獲取進度條要顯示的文字。 xml

進度條的消失

    首先來介紹如何讓ProgressBar消失。
    讓進度條顯示的方法很簡單,只要調用ProgressDialog類的show方法便可。
    

    ourProgressHandler變量指向的Handler類中一旦收到子線程的「通知」就會讓進度條消失 圖片

    

    這裏要請你們注意一下,UIUtil類的wait方法考慮到了多重後臺任務的狀況下,進度條怎樣顯示與消失。多重後臺任務的狀況,確定必須是全部任務都完成的狀況下,才能讓進度條消失,那麼代碼是如何實現的呢?

    代碼首先在UIUtil類的wait方法中用ourTaskQueue屬性保存全部的後臺任務
     資源

    而後,在Handler類中判斷ourTaskQueue中是否爲空,爲空時才讓進度條消失 get

    

    同時,由於子線程和Handler類都在操做ourTaskQueue,必須使用wait方法和notify方法保證整個變量線程安全 it

    

進度條上要顯示的文字

    接下來,介紹如何獲取ProgressBar要顯示的文字
    顯示在進度條上的文字就是從資源文件裏面讀取出來的message變量。
    

    資源文件的位置在assets/resourses中application和zlibrary兩個文件夾中。    

    

    這兩個文件夾中存儲了各類語言的版本,其中FBReader程序默認的是uk.xml,而代碼最終會根據手機的語言設置,去顯示zh.xml中的內容。

    

    咱們要尋找的顯示在ProgressBar中的文字就在application文件夾中zh.xml文件中dialog節點下的waitMesssage節點下的loadingBook節點的value屬性。

    

    代碼具體如何解析zh.xml文件,來獲取指定節點下的value屬性,咱們將在下一章中介紹。

相關文章
相關標籤/搜索