Android 進(jìn)程和線程

Android 進(jìn)程和線程

當(dāng)一個(gè)應(yīng)用程序組件啟動(dòng)和應(yīng)用程序沒有任何其他組件在運(yùn)行時(shí),Android系統(tǒng)開始一個(gè)新的Linux進(jìn)程執(zhí)行一個(gè)線程應(yīng)用弄兜。 默認(rèn)情況下萝挤,同一個(gè)應(yīng)用程序的所有組件運(yùn)行在相同的進(jìn)程和線程里(稱為“主”線程)蹂窖。如果一個(gè)應(yīng)用程序組件啟動(dòng)并且已經(jīng)存在一個(gè)申請(qǐng)的過程(因?yàn)榱硪粋€(gè)組件的應(yīng)用程序的存在)猜年,那么該組件在程序啟動(dòng)并使用相同的執(zhí)行線程。然而你可以在你的應(yīng)用程序運(yùn)行在單獨(dú)的進(jìn)程安排不同的組件疾忍,您可以創(chuàng)建額外的線程的任何進(jìn)程乔外。

本文討論了進(jìn)程和線程在一個(gè)Android應(yīng)用程序的工作。

Processes 進(jìn)程

默認(rèn)情況下一罩,所有的組件相同的應(yīng)用程序運(yùn)行在同一進(jìn)程中杨幼,大多數(shù)應(yīng)用程序不應(yīng)該改變這個(gè)。然而,如果你發(fā)現(xiàn)你需要控制某個(gè)組件所在的進(jìn)程差购,你可以在manifest文件中四瘫。

Manifest 為每個(gè)類型的組件—<activity>, <service>, <receiver>, 和 <provider>—支持 android:process 屬性,可以指定組件應(yīng)該運(yùn)行在的進(jìn)程欲逃。你可以設(shè)置這個(gè)屬性使每個(gè)組件運(yùn)行在自己的進(jìn)程或使一些組件共享一個(gè)進(jìn)程而別人不找蜜。你也可以設(shè)置android:process 使不同應(yīng)用程序的組件運(yùn)行在同一進(jìn)程中提供的應(yīng)用程序共享相同的Linux用戶ID和具有相同的簽名的證書。

該<application>元素也支持android:process屬性稳析,去設(shè)置應(yīng)用到所有組件的默認(rèn)值洗做。

Android可能會(huì)決定關(guān)閉一個(gè)進(jìn)程在一些點(diǎn),當(dāng)內(nèi)存低彰居,需要的是其他過程更直接的用戶服務(wù)诚纸。應(yīng)用組件運(yùn)行的過程中,也因此被殺死陈惰。一個(gè)過程再次開始為這些組件時(shí)畦徘,又為他們做的工作。

當(dāng)決定殺死哪個(gè)進(jìn)程抬闯,Android系統(tǒng)衡量他們對(duì)用戶的重要性井辆。例如,它更容易關(guān)閉過程舉辦活動(dòng)画髓,不再是在屏幕上可見掘剪,相比一個(gè)宿主進(jìn)程可見的活動(dòng)。決定是否終止一個(gè)進(jìn)程奈虾,因此夺谁,取決于在進(jìn)程中運(yùn)行的組件的狀態(tài)。使用的規(guī)則來決定誰會(huì)被終止肉微。

Process lifecycle 進(jìn)程生命周期

Android系統(tǒng)試圖盡可能長(zhǎng)時(shí)間保持一個(gè)應(yīng)用程序進(jìn)程匾鸥,但最終需要?jiǎng)h除舊的進(jìn)程,以回收內(nèi)存用于新的或更重要的進(jìn)程的啟動(dòng)碉纳。 要確定哪些進(jìn)程保持和殺死勿负,系統(tǒng)會(huì)將每個(gè)進(jìn)程列入一個(gè)“優(yōu)先級(jí)層次結(jié)構(gòu)”。 第一消除與最低優(yōu)先級(jí)的進(jìn)程劳曹,然后是下一個(gè)最低的優(yōu)先級(jí)奴愉,依此類推,直到恢復(fù)所需的系統(tǒng)資源铁孵。.

有五個(gè)級(jí)別的優(yōu)先級(jí)锭硼。 下面的列表中列出了不同類型的進(jìn)程的優(yōu)先級(jí)順序(第一個(gè)是最重要的 , 最后被殺死 ):

  • 1.Foreground process 前臺(tái)進(jìn)程

    這一進(jìn)程是用戶正在做的前臺(tái)進(jìn)程蜕劝。認(rèn)為如果下列條件為真:

    • 它承載了一個(gè) Activity檀头,與用戶進(jìn)行交互活動(dòng)( Activity 的onResume()方法被調(diào)用)轰异。
    • 它承載了一個(gè) Service 綁定了該用戶的互動(dòng)與活動(dòng)。
    • 它承載了一個(gè) Service 運(yùn)行在前臺(tái)---—這個(gè)service 調(diào)用了 startForeground().
    • 它承載了一個(gè) Service 執(zhí)行了一個(gè)生命周期的回調(diào) (onCreate(), onStart(), 或 onDestroy()).
    • 它承載了一個(gè) BroadcastReceiver 執(zhí)行了他的 onReceive() 方法.
      一般來說暑始,只有僅剩一些前臺(tái)進(jìn)程存在的時(shí)候搭独。殺死他們只作為最后的手段,如果內(nèi)存是如此之低廊镜,連他們都無法繼續(xù)運(yùn)行時(shí)牙肝。一般來說,在這一點(diǎn)上期升,該裝置已達(dá)到一個(gè)內(nèi)存分頁(yè)狀態(tài)惊奇,因此殺死一些前臺(tái)進(jìn)程是為了保持用戶界面的響應(yīng)。
  • 2.Visible process 可見進(jìn)程

一個(gè)過程播赁,沒有任何前景的組件颂郎,但仍會(huì)影響到用戶所看到的屏幕上。一個(gè)過程被認(rèn)為是可見容为,如果滿足下列條件:

  • 它承載了一個(gè) Activity 不在前臺(tái),但仍然對(duì)用戶可見的(其onPause()方法被調(diào)用) 這可能發(fā)生乓序,例如,如果前臺(tái)活動(dòng)開始了對(duì)話坎背,這允許先前的活動(dòng)可以看到后面替劈。

  • 它承載了一個(gè) Service 綁定到一個(gè)可見的(或前景) activity.
    一個(gè)可見進(jìn)程被認(rèn)為非常重要,如果殺死他們得滤,一定是為了保持所有前臺(tái)進(jìn)程運(yùn)行陨献。

  • 3.Service process 服務(wù)進(jìn)程

這一進(jìn)程運(yùn)行的service ,是那些已執(zhí)行startService() 方法且不屬于前面兩個(gè)高類別的服務(wù)懂更。雖然服務(wù)流程不是所有用戶可見的眨业,但他們所做的事是用戶關(guān)心的(如播放背景音樂或下載數(shù)據(jù)在網(wǎng)絡(luò)上),所以系統(tǒng)會(huì)保持運(yùn)行沮协,除非沒有足夠的內(nèi)存來保持他們?cè)谒械那芭_(tái)和可見的進(jìn)程龄捡。

  • 4.Background process 后臺(tái)進(jìn)程

一個(gè)進(jìn)程開啟過activity ,但是當(dāng)前用戶不可見(活動(dòng)的onStop()方法被調(diào)用)慷暂。這些進(jìn)程對(duì)用戶的體驗(yàn)沒有直接的影響聘殖,并且該系統(tǒng)可以隨時(shí)殺死他們回收前臺(tái),可見的內(nèi)存行瑞,或服務(wù)進(jìn)程奸腺。通常有許多后臺(tái)進(jìn)程在運(yùn)行,所以他們被保存在一個(gè)LRU(最近最少使用)列表以確保與活動(dòng)血久,最近被用戶看到的進(jìn)程是被最后殺死的洋机。如果一個(gè)活動(dòng)實(shí)現(xiàn)其生命周期方法正確,并保存其當(dāng)前狀態(tài)洋魂,殺死它的進(jìn)程將不會(huì)對(duì)用戶體驗(yàn)產(chǎn)生可見的效果,因?yàn)楫?dāng)用戶導(dǎo)航回到活動(dòng),活動(dòng)恢復(fù)它的所有可見的狀態(tài)副砍∠沃看Activities文檔信息的保存和恢復(fù)狀態(tài)。

  • 5.Empty process 空進(jìn)程

一個(gè)進(jìn)程豁翎,不舉行任何活動(dòng)的應(yīng)用程序組件角骤。保留這種進(jìn)程的唯一原因是緩存的目的,提高組件的啟動(dòng)時(shí)間需要運(yùn)行在它的下一次心剥。系統(tǒng)常常殺死這些進(jìn)程來平衡整個(gè)系統(tǒng)的資源過程緩存和底層內(nèi)核緩存之間邦尊。

一個(gè)進(jìn)程可以有較高級(jí)別的Android的優(yōu)先級(jí),基于它的重要性优烧。例如蝉揍,如果一個(gè)進(jìn)程開啟了 一個(gè)service 和一個(gè)可見的activity,這個(gè)進(jìn)程的將作為一個(gè)可見的過程畦娄,不是一個(gè)服務(wù)過程又沾。

此外,一個(gè)進(jìn)程的排名可能會(huì)增加熙卡,因?yàn)槠渌牧鞒潭家蕾囉谒囊粋€(gè)過程杖刷,是為另一個(gè)進(jìn)程永遠(yuǎn)不能被排名低于這個(gè)過程中,服務(wù)驳癌。 例如滑燃,如果一個(gè)內(nèi)容提供商過程中的服務(wù)進(jìn)程B中的客戶端或服務(wù)過程中,如果A是必然進(jìn)程B中的一個(gè)組件颓鲜,進(jìn)程A總是被認(rèn)為至少是同樣重要進(jìn)程B

因?yàn)橐粋€(gè)進(jìn)程運(yùn)行服務(wù)的過程與背景活動(dòng)表窘,發(fā)起一項(xiàng)活動(dòng),可能會(huì)做一個(gè)長(zhǎng)期運(yùn)行的操作灾杰,操作以及啟動(dòng)服務(wù) 蚊丐,而不是簡(jiǎn)單地創(chuàng)建一個(gè)工作線程,特別是如果操作將可能高于排名經(jīng)久活動(dòng)艳吠。 例如麦备,一個(gè)活動(dòng)的圖片上傳到一個(gè)網(wǎng)站,應(yīng)該啟動(dòng)一個(gè)服務(wù)執(zhí)行上傳昭娩,因此可以繼續(xù)在后臺(tái)上傳凛篙,即使用戶離開活動(dòng)。 使用服務(wù)保證該操作將至少有“服務(wù)進(jìn)程”的優(yōu)先級(jí)栏渺,不管發(fā)生了什么活動(dòng)呛梆。 廣播接收機(jī)應(yīng)采用服務(wù),而不是簡(jiǎn)單地把在一個(gè)線程中耗時(shí)的操作磕诊,這是一樣的道理填物。

Threads 線程

當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí)纹腌,系統(tǒng)會(huì)創(chuàng)建一個(gè)線程執(zhí)行的應(yīng)用,稱為“主”滞磺。 這個(gè)線程是很重要的升薯,因?yàn)樗窃谑录{(diào)度到相應(yīng)的用戶界面部件,包括繪圖事件負(fù)責(zé)击困。 它也是你的應(yīng)用程序從Android的UI工具包的android.widget和android.view封裝的組件與組件的線程涎劈。 因此,主線程有時(shí)也稱為UI線程阅茶。

系統(tǒng)不會(huì)為每一個(gè)組件實(shí)例創(chuàng)建單獨(dú)的線程蛛枚。 所有在同一個(gè)進(jìn)程中運(yùn)行的組件在UI線程中實(shí)例化,并從該線程調(diào)度系統(tǒng)每個(gè)組件的調(diào)??用脸哀。 因此蹦浦,方法,應(yīng)對(duì)系統(tǒng)的回調(diào)(如onKeyDown()報(bào)告用戶操作或生命周期回調(diào)方法)總是運(yùn)行在UI線程中的過程企蹭。

例如白筹,當(dāng)用戶觸摸屏幕上的一個(gè)按鈕,您的應(yīng)用程序的UI線程分發(fā)觸摸事件到窗口谅摄,這反過來又將其壓狀態(tài)和發(fā)送一個(gè)無效的請(qǐng)求事件隊(duì)列徒河。UI線程取出請(qǐng)求和通知部件應(yīng)該重繪自己。

當(dāng)你的應(yīng)用程序執(zhí)行密集的響應(yīng)用戶的交互送漠,單線程模型可能產(chǎn)生性能差顽照,除非你恰當(dāng)?shù)膶?shí)現(xiàn)你的應(yīng)用。特別是闽寡,如果所有的事情都是發(fā)生在UI線程代兵,執(zhí)行如網(wǎng)絡(luò)接入或數(shù)據(jù)庫(kù)查詢將會(huì)阻塞整個(gè)UI長(zhǎng)操作。當(dāng)線程被阻塞爷狈,沒有事件可以被分發(fā)植影,包括繪制事件。從用戶的角度出發(fā)涎永,應(yīng)用假死思币。更糟糕的是,如果UI線程被阻塞超過幾秒(約5秒目前)用戶與臭名昭著的“應(yīng)用程序沒有響應(yīng)”(ANR)對(duì)話框羡微。用戶可能決定退出你的應(yīng)用程序和卸載它谷饿,如果他們不高興。

此外妈倔,Andoid UI工具包不是線程安全的博投。所以,你不能從一個(gè)工作者線程盯蝴,你必須做的所有操作用戶界面的UI線程處理你的UI毅哗。因此听怕,只是有兩個(gè)規(guī)則對(duì)Android系統(tǒng)的單線程模型:

  • 不要阻塞UI線程
  • 不能從UI線程外部訪問Android UI工具包

工作線程

由于上述單線程模型,它的應(yīng)用程序的UI的響應(yīng)至關(guān)重要黎做,你不要阻塞UI線程叉跛。如果你已經(jīng)執(zhí)行的操作,是不是瞬時(shí)的蒸殿,你應(yīng)該確保在單獨(dú)的線程做(“后臺(tái)”或“工作”的線程)。

例如鸣峭,下面是一些代碼宏所,點(diǎn)擊監(jiān)聽器下載圖像從一個(gè)單獨(dú)的線程,并顯示在一個(gè)ImageView:

public void onClick(View v) {

    new Thread(new Runnable() {

        public void run() {

            Bitmap b = loadImageFromNetwork("http://example.com/image.png");

            mImageView.setImageBitmap(b);

        }

    }).start();

}

起初摊溶,這似乎工作得很好爬骤,因?yàn)樗鼊?chuàng)建一個(gè)新線程處理網(wǎng)絡(luò)操作。然而莫换,它違反了單線程模型的第二個(gè)規(guī)則:不要從UI線程之外這樣訪問Android UI工具包修改ImageView而非UI線程的線程霞玄。這可能會(huì)導(dǎo)致未定義的和意外的行為,這可能是困難和追蹤耗時(shí)拉岁。

要解決此問題坷剧,Android提供了幾種不同的方式從其他線程訪問UI線程。這里是一個(gè)列表的方法喊暖,可以幫助:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)

例如惫企,你可以通過使用視圖解決上述代碼后(運(yùn)行)的方法:

public void onClick(View v) {

    new Thread(new Runnable() {

        public void run() {

            final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");

            mImageView.post(new Runnable() {

                public void run() {

                    mImageView.setImageBitmap(bitmap);

                }

            });

        }

    }).start();

}

現(xiàn)在,這個(gè)實(shí)現(xiàn)是線程安全的:網(wǎng)絡(luò)操作完成從一個(gè)單獨(dú)的線程陵叽,而ImageView操縱從UI線程狞尔。

然而,由于操作的復(fù)雜性增加巩掺,這種代碼會(huì)變得復(fù)雜和難以維護(hù)偏序。與一個(gè)工作者線程處理更復(fù)雜的交互,你可以考慮使用一個(gè)處理程序在你的線程胖替,處理來自UI線程的消息研儒。也許最好的解決方案,但是刊殉,是擴(kuò)展AsyncTask殉摔,簡(jiǎn)化了工作線程的任務(wù),需要與用戶界面交互執(zhí)行记焊。

使用AsyncTask

AsyncTask允許你在你的用戶界面執(zhí)行異步工作逸月。它在工作線程中執(zhí)行阻塞操作,然后公布在UI線程上的結(jié)果遍膜,而不需要你去處理線程和/或處理自己碗硬。

使用它瓤湘,你必須擴(kuò)展AsyncTask并且實(shí)現(xiàn)doinbackground()回調(diào)方法,它運(yùn)行在后臺(tái)線程池恩尾。更新你的UI弛说,你應(yīng)該實(shí)現(xiàn)onpostexecute(),提供從doinbackground()結(jié)果和運(yùn)行在UI線程翰意,因此你可以安全地更新UI木人。然后你可以通過從UI線程調(diào)用execute()運(yùn)行任務(wù)。

例如冀偶,你可以使用AsyncTask這樣實(shí)施以前的例子:

public void onClick(View v) {

    new DownloadImageTask().execute("http://example.com/image.png");

}



private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

    /** The system calls this to perform work in a worker thread and

      * delivers it the parameters given to AsyncTask.execute() */

    protected Bitmap doInBackground(String... urls) {

        return loadImageFromNetwork(urls[0]);

    }

    

    /** The system calls this to perform work in the UI thread and delivers

      * the result from doInBackground() */

    protected void onPostExecute(Bitmap result) {

        mImageView.setImageBitmap(result);

    }

}

進(jìn)程間通信

Android提供了一個(gè)用于進(jìn)程間通信(IPC)機(jī)制醒第,使用遠(yuǎn)程過程調(diào)用(RPC)方法被稱為一個(gè)活動(dòng)或其他應(yīng)用程序組件,但遠(yuǎn)程執(zhí)行(在另一個(gè)進(jìn)程中)进鸠,返回給調(diào)用者返回任何結(jié)果稠曼。 這需要一個(gè)方法調(diào)用和它的數(shù)據(jù)分解到一個(gè)水平,操作系統(tǒng)可以理解的客年,傳送過程和從本地到遠(yuǎn)程進(jìn)程和地址空間的地址空間霞幅,然后重新組裝,重演呼叫量瓜。 返回值司恳,然后在相反的方向傳送。 Android提供了所有的代碼來執(zhí)行這些IPC交易榔至,這樣你就可以專注于定義和執(zhí)行RPC編程接口抵赢。

  • android中線程與線程,進(jìn)程與進(jìn)程之間如何通信1唧取、一個(gè) Android 程序開始運(yùn)行時(shí)铅鲤,會(huì)單獨(dú)啟動(dòng)一個(gè)Process。
    默認(rèn)情況下枫弟,所有這個(gè)程序中的Activity或者Service都會(huì)跑在這個(gè)Process邢享。
    默認(rèn)情況下,一個(gè)Android程序也只有一個(gè)Process淡诗,但一個(gè)Process下卻可以有許多個(gè)Thread骇塘。
  • 一個(gè) Android 程序開始運(yùn)行時(shí),就有一個(gè)主線程Main Thread被創(chuàng)建韩容。該線程主要負(fù)責(zé)UI界面的顯示款违、更新和控件交互,所以又叫UI Thread群凶。
    一 個(gè)Android程序創(chuàng)建之初插爹,一個(gè)Process呈現(xiàn)的是單線程模型--即Main Thread,所有的任務(wù)都在一個(gè)線程中運(yùn)行。所 以赠尾,Main Thread所調(diào)用的每一個(gè)函數(shù)力穗,其耗時(shí)應(yīng)該越短越好。而對(duì)于比較費(fèi)時(shí)的工作气嫁,應(yīng)該設(shè)法交給子線程去做当窗,以避免阻塞主線程(主線程被阻塞, 會(huì)導(dǎo)致程序假死 現(xiàn)象)寸宵。
  • Android單線程模型:Android UI操作并不是線程安全的并且這些操作必須在UI線程中執(zhí)行崖面。如果在子線程中直接修改UI,會(huì)導(dǎo)致異常邓馒。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘶朱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子光酣,更是在濱河造成了極大的恐慌,老刑警劉巖脉课,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件救军,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡倘零,警方通過查閱死者的電腦和手機(jī)唱遭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呈驶,“玉大人拷泽,你說我怎么就攤上這事⌒湔埃” “怎么了司致?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)聋迎。 經(jīng)常有香客問我脂矫,道長(zhǎng),這世上最難降的妖魔是什么霉晕? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任庭再,我火速辦了婚禮,結(jié)果婚禮上牺堰,老公的妹妹穿的比我還像新娘拄轻。我一直安慰自己,他們只是感情好伟葫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布恨搓。 她就那樣靜靜地躺著,像睡著了一般扒俯。 火紅的嫁衣襯著肌膚如雪奶卓。 梳的紋絲不亂的頭發(fā)上一疯,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音夺姑,去河邊找鬼墩邀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盏浙,可吹牛的內(nèi)容都是我干的眉睹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼废膘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竹海!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丐黄,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤斋配,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灌闺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艰争,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年桂对,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甩卓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕉斜,死狀恐怖逾柿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宅此,我是刑警寧澤机错,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站诽凌,受9級(jí)特大地震影響毡熏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侣诵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一痢法、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杜顺,春花似錦峡蟋、人聲如沸惯悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春提茁,著一層夾襖步出監(jiān)牢的瞬間淹禾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工茴扁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铃岔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓峭火,卻偏偏與公主長(zhǎng)得像毁习,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卖丸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,080評(píng)論 25 707
  • 轉(zhuǎn)自:https://developer.android.com/guide/components/process...
    畫峰閱讀 212評(píng)論 0 0
  • 當(dāng)應(yīng)用程序組件啟動(dòng)并且應(yīng)用程序沒有任何其他組件運(yùn)行時(shí)纺且,Android系統(tǒng)將使用單個(gè)執(zhí)行線程為應(yīng)用程序啟動(dòng)一個(gè)新的L...
    朋永閱讀 267評(píng)論 0 0
  • 林_語(yǔ)棠閱讀 220評(píng)論 0 2
  • 這是暗物質(zhì),小能熊365天寫作計(jì)劃第六十九天的寫作內(nèi)容稍浆,謝絕轉(zhuǎn)載载碌。 “你現(xiàn)在有兩個(gè)選擇,要么一會(huì)兒協(xié)助我戰(zhàn)斗衅枫,要么...
    黑暗物質(zhì)閱讀 285評(píng)論 0 0