Android 中的進(jìn)程和線程


當(dāng)某個(gè)應(yīng)用組件啟動(dòng)且該應(yīng)用沒有運(yùn)行其他任何組件時(shí)账忘,Android 系統(tǒng)會(huì)使用單個(gè)執(zhí)行線程為應(yīng)用啟動(dòng)新的 Linux 進(jìn)程列吼。默認(rèn)情況下骑疆,同一應(yīng)用的所有組件在相同的進(jìn)程和線程(稱為“主”線程)中運(yùn)行贿肩。 如果某個(gè)應(yīng)用組件啟動(dòng)且該應(yīng)用已存在進(jìn)程(因?yàn)榇嬖谠搼?yīng)用的其他組件)座哩,則該組件會(huì)在此進(jìn)程內(nèi)啟動(dòng)并使用相同的執(zhí)行線程苍凛。 但是氧急,您可以安排應(yīng)用中的其他組件在單獨(dú)的進(jìn)程中運(yùn)行,并為任何進(jìn)程創(chuàng)建額外的線程毫深。

本文檔介紹進(jìn)程和線程在 Android 應(yīng)用中的工作方式吩坝。


進(jìn)程

默認(rèn)情況下,同一應(yīng)用的所有組件均在相同的進(jìn)程中運(yùn)行哑蔫,且大多數(shù)應(yīng)用都不會(huì)改變這一點(diǎn)钉寝。 但是,如果您發(fā)現(xiàn)需要控制某個(gè)組件所屬的進(jìn)程闸迷,則可在清單文件中執(zhí)行此操作嵌纲。

各類組件元素的清單文件條目—<activity>、<service>腥沽、<receiver> 和 <provider>—均支持 android:process 屬性逮走,此屬性可以指定該組件應(yīng)在哪個(gè)進(jìn)程運(yùn)行。您可以設(shè)置此屬性今阳,使每個(gè)組件均在各自的進(jìn)程中運(yùn)行师溅,或者使一些組件共享一個(gè)進(jìn)程,而其他組件則不共享盾舌。 此外墓臭,您還可以設(shè)置 android:process,使不同應(yīng)用的組件在相同的進(jìn)程中運(yùn)行妖谴,但前提是這些應(yīng)用共享相同的 Linux 用戶 ID 并使用相同的證書進(jìn)行簽署窿锉。

此外,<application> 元素還支持 android:process 屬性,以設(shè)置適用于所有組件的默認(rèn)值嗡载。

如果內(nèi)存不足窑多,而其他為用戶提供更緊急服務(wù)的進(jìn)程又需要內(nèi)存時(shí),Android 可能會(huì)決定在某一時(shí)刻關(guān)閉某一進(jìn)程洼滚。在被終止進(jìn)程中運(yùn)行的應(yīng)用組件也會(huì)隨之銷毀怯伊。 當(dāng)這些組件需要再次運(yùn)行時(shí),系統(tǒng)將為它們重啟進(jìn)程判沟。

決定終止哪個(gè)進(jìn)程時(shí),Android 系統(tǒng)將權(quán)衡它們對用戶的相對重要程度崭篡。例如挪哄,相對于托管可見 Activity 的進(jìn)程而言,它更有可能關(guān)閉托管屏幕上不再可見的 Activity 進(jìn)程琉闪。 因此迹炼,是否終止某個(gè)進(jìn)程的決定取決于該進(jìn)程中所運(yùn)行組件的狀態(tài)。 下面颠毙,我們介紹決定終止進(jìn)程所用的規(guī)則斯入。

進(jìn)程生命周期

Android 系統(tǒng)將盡量長時(shí)間地保持應(yīng)用進(jìn)程,但為了新建進(jìn)程或運(yùn)行更重要的進(jìn)程蛀蜜,最終需要清除舊進(jìn)程來回收內(nèi)存刻两。 為了確定保留或終止哪些進(jìn)程,系統(tǒng)會(huì)根據(jù)進(jìn)程中正在運(yùn)行的組件以及這些組件的狀態(tài)滴某,將每個(gè)進(jìn)程放入“重要性層次結(jié)構(gòu)”中磅摹。 必要時(shí),系統(tǒng)會(huì)首先消除重要性最低的進(jìn)程霎奢,然后是重要性略遜的進(jìn)程户誓,依此類推,以回收系統(tǒng)資源幕侠。

重要性層次結(jié)構(gòu)一共有 5 級帝美。以下列表按照重要程度列出了各類進(jìn)程(第一個(gè)進(jìn)程最重要,將是最后一個(gè)被終止的進(jìn)程):

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

用戶當(dāng)前操作所必需的進(jìn)程晤硕。如果一個(gè)進(jìn)程滿足以下任一條件悼潭,即視為前臺(tái)進(jìn)程:

  • 托管用戶正在交互的 Activity(已調(diào)用 Activity 的 onResume() 方法)
  • 托管某個(gè) Service,后者綁定到用戶正在交互的 Activity
  • 托管正在“前臺(tái)”運(yùn)行的 Service(服務(wù)已調(diào)用 startForeground())
  • 托管正執(zhí)行一個(gè)生命周期回調(diào)的 Service(onCreate()舞箍、onStart() 或 onDestroy())
  • 托管正執(zhí)行其 onReceive() 方法的 BroadcastReceiver

通常女责,在任意給定時(shí)間前臺(tái)進(jìn)程都為數(shù)不多。只有在內(nèi)在不足以支持它們同時(shí)繼續(xù)運(yùn)行這一萬不得已的情況下创译,系統(tǒng)才會(huì)終止它們抵知。
此時(shí),設(shè)備往往已達(dá)到內(nèi)存分頁狀態(tài),因此需要終止一些前臺(tái)進(jìn)程來確保用戶界面正常響應(yīng)刷喜。

2.可見進(jìn)程

沒有任何前臺(tái)組件残制、但仍會(huì)影響用戶在屏幕上所見內(nèi)容的進(jìn)程。 如果一個(gè)進(jìn)程滿足以下任一條件掖疮,即視為可見進(jìn)程: 托管不在前臺(tái)初茶、但仍對用戶可見的
Activity(已調(diào)用其 onPause() 方法)。例如浊闪,如果前臺(tái) Activity 啟動(dòng)了一個(gè)對話框恼布,允許在其后顯示上一
Activity,則有可能會(huì)發(fā)生這種情況 托管綁定到可見(或前臺(tái))Activity 的 Service
可見進(jìn)程被視為是極其重要的進(jìn)程搁宾,除非為了維持所有前臺(tái)進(jìn)程同時(shí)運(yùn)行而必須終止折汞,否則系統(tǒng)不會(huì)終止這些進(jìn)程。

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

正在運(yùn)行已使用 startService()
方法啟動(dòng)的服務(wù)且不屬于上述兩個(gè)更高類別進(jìn)程的進(jìn)程盖腿。盡管服務(wù)進(jìn)程與用戶所見內(nèi)容沒有直接關(guān)聯(lián)爽待,但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如,在后臺(tái)播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))翩腐。因此鸟款,除非內(nèi)存不足以維持所有前臺(tái)進(jìn)程和可見進(jìn)程同時(shí)運(yùn)行,否則系統(tǒng)會(huì)讓服務(wù)進(jìn)程保持運(yùn)行狀態(tài)茂卦。

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

包含目前對用戶不可見的 Activity 的進(jìn)程(已調(diào)用 Activity 的 onStop()
方法)何什。這些進(jìn)程對用戶體驗(yàn)沒有直接影響,系統(tǒng)可能隨時(shí)終止它們等龙,以回收內(nèi)存供前臺(tái)進(jìn)程富俄、可見進(jìn)程或服務(wù)進(jìn)程使用。
通常會(huì)有很多后臺(tái)進(jìn)程在運(yùn)行而咆,因此它們會(huì)保存在 LRU (最近最少使用)列表中霍比,以確保包含用戶最近查看的 Activity
的進(jìn)程最后一個(gè)被終止。如果某個(gè) Activity
正確實(shí)現(xiàn)了生命周期方法暴备,并保存了其當(dāng)前狀態(tài)悠瞬,則終止其進(jìn)程不會(huì)對用戶體驗(yàn)產(chǎn)生明顯影響,因?yàn)楫?dāng)用戶導(dǎo)航回該 Activity
時(shí)涯捻,Activity 會(huì)恢復(fù)其所有可見狀態(tài)浅妆。 有關(guān)保存和恢復(fù)狀態(tài)的信息,請參閱Activity文檔障癌。

5.空進(jìn)程

不含任何活動(dòng)應(yīng)用組件的進(jìn)程凌外。保留這種進(jìn)程的的唯一目的是用作緩存,以縮短下次在其中運(yùn)行組件所需的啟動(dòng)時(shí)間涛浙。
為使總體系統(tǒng)資源在進(jìn)程緩存和底層內(nèi)核緩存之間保持平衡康辑,系統(tǒng)往往會(huì)終止這些進(jìn)程摄欲。 根據(jù)進(jìn)程中當(dāng)前活動(dòng)組件的重要程度,Android
會(huì)將進(jìn)程評定為它可能達(dá)到的最高級別疮薇。例如胸墙,如果某進(jìn)程托管著服務(wù)和可見 Activity,則會(huì)將此進(jìn)程評定為可見進(jìn)程按咒,而不是服務(wù)進(jìn)程迟隅。

此外,一個(gè)進(jìn)程的級別可能會(huì)因其他進(jìn)程對它的依賴而有所提高励七,即服務(wù)于另一進(jìn)程的進(jìn)程其級別永遠(yuǎn)不會(huì)低于其所服務(wù)的進(jìn)程智袭。 例如,如果進(jìn)程 A
中的內(nèi)容提供程序?yàn)檫M(jìn)程 B 中的客戶端提供服務(wù)掠抬,或者如果進(jìn)程 A 中的服務(wù)綁定到進(jìn)程 B 中的組件吼野,則進(jìn)程 A 始終被視為至少與進(jìn)程 B
同樣重要。

由于運(yùn)行服務(wù)的進(jìn)程其級別高于托管后臺(tái) Activity 的進(jìn)程剿另,因此啟動(dòng)長時(shí)間運(yùn)行操作的 Activity
最好為該操作啟動(dòng)服務(wù),而不是簡單地創(chuàng)建工作線程贬蛙,當(dāng)操作有可能比 Activity 更加持久時(shí)尤要如此雨女。例如,正在將圖片上傳到網(wǎng)站的
Activity 應(yīng)該啟動(dòng)服務(wù)來執(zhí)行上傳阳准,這樣一來氛堕,即使用戶退出 Activity,仍可在后臺(tái)繼續(xù)執(zhí)行上傳操作野蝇。使用服務(wù)可以保證讼稚,無論
Activity 發(fā)生什么情況,該操作至少具備“服務(wù)進(jìn)程”優(yōu)先級绕沈。 同理锐想,廣播接收器也應(yīng)使用服務(wù),而不是簡單地將耗時(shí)冗長的操作放入線程中乍狐。

線程

應(yīng)用啟動(dòng)時(shí)赠摇,系統(tǒng)會(huì)為應(yīng)用創(chuàng)建一個(gè)名為“主線程”的執(zhí)行線程。 此線程非常重要浅蚪,因?yàn)樗?fù)責(zé)將事件分派給相應(yīng)的用戶界面小工具藕帜,其中包括繪圖事件。 此外惜傲,它也是應(yīng)用與 Android UI 工具包組件(來自 android.widget 和 android.view 軟件包的組件)進(jìn)行交互的線程洽故。因此,主線程有時(shí)也稱為 UI 線程盗誊。

系統(tǒng)絕對不會(huì)為每個(gè)組件實(shí)例創(chuàng)建單獨(dú)的線程时甚。運(yùn)行于同一進(jìn)程的所有組件均在 UI 線程中實(shí)例化隘弊,并且對每個(gè)組件的系統(tǒng)調(diào)用均由該線程進(jìn)行分派。因此撞秋,響應(yīng)系統(tǒng)回調(diào)的方法(例如长捧,報(bào)告用戶操作的 onKeyDown() 或生命周期回調(diào)方法)始終在進(jìn)程的 UI 線程中運(yùn)行。

例如吻贿,當(dāng)用戶觸摸屏幕上的按鈕時(shí)串结,應(yīng)用的 UI 線程會(huì)將觸摸事件分派給小工具,而小工具反過來又設(shè)置其按下狀態(tài)舅列,并將無效請求發(fā)布到事件隊(duì)列中肌割。UI 線程從隊(duì)列中取消該請求并通知小工具應(yīng)該重繪自身。

在應(yīng)用執(zhí)行繁重的任務(wù)以響應(yīng)用戶交互時(shí)帐要,除非正確實(shí)施應(yīng)用把敞,否則這種單線程模式可能會(huì)導(dǎo)致性能低下。 特別地榨惠,如果 UI 線程需要處理所有任務(wù)奋早,則執(zhí)行耗時(shí)很長的操作(例如,網(wǎng)絡(luò)訪問或數(shù)據(jù)庫查詢)將會(huì)阻塞整個(gè) UI赠橙。一旦線程被阻塞耽装,將無法分派任何事件,包括繪圖事件期揪。從用戶的角度來看掉奄,應(yīng)用顯示為掛起。 更糟糕的是凤薛,如果 UI 線程被阻塞超過幾秒鐘時(shí)間(目前大約是 5 秒鐘)姓建,用戶就會(huì)看到一個(gè)讓人厭煩的“應(yīng)用無響應(yīng)”(ANR) 對話框。如果引起用戶不滿缤苫,他們可能就會(huì)決定退出并卸載此應(yīng)用速兔。

此外,Android UI 工具包并非線程安全工具包活玲。因此憨栽,您不得通過工作線程操縱 UI,而只能通過 UI 線程操縱用戶界面翼虫。因此屑柔,Android 的單線程模式必須遵守兩條規(guī)則:

不要阻塞 UI 線程
不要在 UI 線程之外訪問 Android UI 工具包

工作線程

根據(jù)上述單線程模式,要保證應(yīng)用 UI 的響應(yīng)能力珍剑,關(guān)鍵是不能阻塞 UI 線程掸宛。如果執(zhí)行的操作不能很快完成,則應(yīng)確保它們在單獨(dú)的線程(“后臺(tái)”或“工作”線程)中運(yùn)行招拙。

例如唧瘾,以下代碼演示了一個(gè)點(diǎn)擊偵聽器從單獨(dú)的線程下載圖像并將其顯示在 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)行良好,因?yàn)樗鼊?chuàng)建了一個(gè)新線程來處理網(wǎng)絡(luò)操作饰序。 但是领虹,它違反了單線程模式的第二條規(guī)則:不要在 UI 線程之外訪問 Android UI 工具包—此示例從工作線程(而不是 UI 線程)修改了 ImageView。這可能導(dǎo)致出現(xiàn)不明確求豫、不可預(yù)見的行為塌衰,但要跟蹤此行為困難而又費(fèi)時(shí)。

為解決此問題蝠嘉,Android 提供了幾種途徑來從其他線程訪問 UI 線程最疆。以下列出了幾種有用的方法:

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

例如,您可以通過使用 View.post(Runnable) 方法修復(fù)上述代碼:

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)在蚤告,上述實(shí)現(xiàn)屬于線程安全型:在單獨(dú)的線程中完成網(wǎng)絡(luò)操作努酸,而在 UI 線程中操縱 ImageView。

但是杜恰,隨著操作日趨復(fù)雜获诈,這類代碼也會(huì)變得復(fù)雜且難以維護(hù)。 要通過工作線程處理更復(fù)雜的交互心褐,可以考慮在工作線程中使用 Handler 處理來自 UI 線程的消息舔涎。當(dāng)然,最好的解決方案或許是擴(kuò)展 AsyncTask 類檬寂,此類簡化了與 UI 進(jìn)行交互所需執(zhí)行的工作線程任務(wù)终抽。

使用 AsyncTask

AsyncTask 允許對用戶界面執(zhí)行異步操作戳表。它會(huì)先阻塞工作線程中的操作桶至,然后在 UI 線程中發(fā)布結(jié)果,而無需您親自處理線程和/或處理程序匾旭。

要使用它镣屹,必須創(chuàng)建 AsyncTask 子類并實(shí)現(xiàn) doInBackground() 回調(diào)方法,該方法將在后臺(tái)線程池中運(yùn)行价涝。要更新 UI女蜈,必須實(shí)現(xiàn) onPostExecute() 以傳遞 doInBackground() 返回的結(jié)果并在 UI 線程中運(yùn)行,這樣色瘩,您即可安全更新 UI伪窖。稍后,您可以通過從 UI 線程調(diào)用 execute() 來運(yùn)行任務(wù)居兆。

例如覆山,您可以通過以下方式使用 AsyncTask 來實(shí)現(xiàn)上述示例:

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);
    }
}

現(xiàn)在 UI 是安全的,代碼也得到簡化泥栖,因?yàn)槿蝿?wù)分解成了兩部分:一部分應(yīng)在工作線程內(nèi)完成簇宽,另一部分應(yīng)在 UI 線程內(nèi)完成勋篓。

下面簡要概述了 AsyncTask 的工作方法,但要全面了解如何使用此類魏割,您應(yīng)閱讀 AsyncTask 參考文檔:

可以使用泛型指定參數(shù)類型譬嚣、進(jìn)度值和任務(wù)最終值 方法 doInBackground() 會(huì)在工作線程上自動(dòng)執(zhí)行
onPreExecute()onPostExecute()onProgressUpdate() 均在 UI 線程中調(diào)用
doInBackground() 返回的值將發(fā)送到 onPostExecute() 您可以隨時(shí)在
doInBackground() 中調(diào)用publishProgress()钞它,以在 UI 線程中執(zhí)行
onProgressUpdate() 您可以隨時(shí)取消任何線程中的任務(wù)
注意:使用工作線程時(shí)可能會(huì)遇到另一個(gè)問題拜银,即:運(yùn)行時(shí)配置變更(例如,用戶更改了屏幕方向)導(dǎo)致 Activity
意外重啟须揣,這可能會(huì)銷毀工作線程盐股。 要了解如何在這種重啟情況下堅(jiān)持執(zhí)行任務(wù),以及如何在 Activity
被銷毀時(shí)正確地取消任務(wù)耻卡,請參閱書架示例應(yīng)用的源代碼疯汁。

線程安全方法

在某些情況下,您實(shí)現(xiàn)的方法可能會(huì)從多個(gè)線程調(diào)用卵酪,因此編寫這些方法時(shí)必須確保其滿足線程安全的要求幌蚊。

這一點(diǎn)主要適用于可以遠(yuǎn)程調(diào)用的方法,如綁定服務(wù)中的方法溃卡。如果對 IBinder 中所實(shí)現(xiàn)方法的調(diào)用源自運(yùn)行 IBinder 的同一進(jìn)程溢豆,則該方法在調(diào)用方的線程中執(zhí)行。但是瘸羡,如果調(diào)用源自其他進(jìn)程漩仙,則該方法將在從線程池選擇的某個(gè)線程中執(zhí)行(而不是在進(jìn)程的 UI 線程中執(zhí)行),線程池由系統(tǒng)在與 IBinder 相同的進(jìn)程中維護(hù)犹赖。例如队他,即使服務(wù)的 onBind() 方法將從服務(wù)進(jìn)程的 UI 線程調(diào)用,在 onBind() 返回的對象中實(shí)現(xiàn)的方法(例如峻村,實(shí)現(xiàn) RPC 方法的子類)仍會(huì)從線程池中的線程調(diào)用麸折。由于一個(gè)服務(wù)可以有多個(gè)客戶端,因此可能會(huì)有多個(gè)池線程在同一時(shí)間使用同一 IBinder 方法粘昨。因此垢啼,IBinder 方法必須實(shí)現(xiàn)為線程安全方法。

同樣张肾,內(nèi)容提供程序也可接收來自其他進(jìn)程的數(shù)據(jù)請求芭析。盡管 ContentResolver 和 ContentProvider 類隱藏了如何管理進(jìn)程間通信的細(xì)節(jié),但響應(yīng)這些請求的 ContentProvider 方法(query()吞瞪、insert()馁启、delete()、update()getType() 方法)將從內(nèi)容提供程序所在進(jìn)程的線程池中調(diào)用尸饺,而不是從進(jìn)程的 UI 線程調(diào)用进统。由于這些方法可能會(huì)同時(shí)從任意數(shù)量的線程調(diào)用助币,因此它們也必須實(shí)現(xiàn)為線程安全方法。

進(jìn)程間通信

Android 利用遠(yuǎn)程過程調(diào)用 (RPC) 提供了一種進(jìn)程間通信 (IPC) 機(jī)制螟碎,通過這種機(jī)制眉菱,由 Activity 或其他應(yīng)用組件調(diào)用的方法將(在其他進(jìn)程中)遠(yuǎn)程執(zhí)行,而所有結(jié)果將返回給調(diào)用方掉分。這就要求把方法調(diào)用及其數(shù)據(jù)分解至操作系統(tǒng)可以識(shí)別的程度俭缓,并將其從本地進(jìn)程和地址空間傳輸至遠(yuǎn)程進(jìn)程和地址空間,然后在遠(yuǎn)程進(jìn)程中重新組裝并執(zhí)行該調(diào)用酥郭。 然后华坦,返回值將沿相反方向傳輸回來。 Android 提供了執(zhí)行這些 IPC 事務(wù)所需的全部代碼不从,因此您只需集中精力定義和實(shí)現(xiàn) RPC 編程接口即可惜姐。

要執(zhí)行 IPC,必須使用 bindService() 將應(yīng)用綁定到服務(wù)上椿息。如需了解詳細(xì)信息歹袁,請參閱服務(wù)開發(fā)者指南。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寝优,一起剝皮案震驚了整個(gè)濱河市条舔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乏矾,老刑警劉巖孟抗,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钻心,居然都是意外死亡凄硼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門扔役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帆喇,“玉大人警医,你說我怎么就攤上這事亿胸。” “怎么了预皇?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵侈玄,是天一觀的道長。 經(jīng)常有香客問我吟温,道長序仙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任鲁豪,我火速辦了婚禮潘悼,結(jié)果婚禮上律秃,老公的妹妹穿的比我還像新娘。我一直安慰自己治唤,他們只是感情好棒动,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宾添,像睡著了一般船惨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缕陕,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天粱锐,我揣著相機(jī)與錄音,去河邊找鬼扛邑。 笑死怜浅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔬崩。 我是一名探鬼主播海雪,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舱殿!你這毒婦竟也來了奥裸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沪袭,失蹤者是張志新(化名)和其女友劉穎湾宙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冈绊,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侠鳄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了死宣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伟恶。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毅该,靈堂內(nèi)的尸體忽然破棺而出博秫,到底是詐尸還是另有隱情,我是刑警寧澤眶掌,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布挡育,位于F島的核電站,受9級特大地震影響朴爬,放射性物質(zhì)發(fā)生泄漏即寒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望母赵。 院中可真熱鬧逸爵,春花似錦、人聲如沸凹嘲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽施绎。三九已至溯革,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谷醉,已是汗流浹背致稀。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俱尼,地道東北人抖单。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像遇八,于是被迫代替她去往敵國和親矛绘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評論 25 707
  • 前言:本文所寫的是博主的個(gè)人見解刃永,如有錯(cuò)誤或者不恰當(dāng)之處货矮,歡迎私信博主,加以改正斯够!原文鏈接囚玫,demo鏈接 當(dāng)某個(gè)應(yīng)...
    PassersHowe閱讀 528評論 0 1
  • 最近和一大學(xué)好哥們通電話,聊了近況邑贴,聊了所見所聞束亏,聊了漸行漸遠(yuǎn)的同學(xué)和回不去的時(shí)光铃在,也聊到自畢業(yè)后再無聯(lián)系的人兒。...
    素英荊閱讀 276評論 0 1
  • 其他章節(jié)請移步【連載】婚誓輕許,韶華不負(fù)(目錄) 葉淺終于還是被面前的人伸出手?jǐn)堊∽约簝蓚?cè)上臂的動(dòng)作“驚動(dòng)”了雀久,不...
    薄小荷閱讀 759評論 14 15
  • 南方的小城下著雨 你光著腳丫 石板上的清水能映出你白色的裙子 雨滴答滴答 時(shí)鐘嘀嗒嘀嗒 我屏住呼吸 唯恐輕聲細(xì)語吵...
    紅皮花生閱讀 280評論 0 1