動腦學(xué)院Rxjava預(yù)習(xí)資料 Rxjava入門

前言

  • Rxjava由于其基于事件流的鏈?zhǔn)秸{(diào)用、邏輯簡潔 & 使用簡單的特點匣屡,深受各大 Android開發(fā)者的歡迎坠敷。
Github截圖
  • 本文主要:

    1. 面向 剛接觸Rxjava的初學(xué)者
    2. 提供了一份 清晰、簡潔铃剔、易懂的Rxjava入門教程

    涵蓋 基本介紹循榆、原理 & 具體使用等

    1. 解決的是初學(xué)者不理解Rxjava原理 & 不懂得如何使用的問題

希望你們會喜歡析恢。

  1. 本文主要基于Rxjava 2.0
  2. 如果讀者還沒學(xué)習(xí)過Rxjava 1.0也沒關(guān)系,因為Rxjava 2.0只是在Rxjava 1.0上增加了一些新特性秧饮,本質(zhì)原理 & 使用基本相同
示意圖

目錄

示意圖

1. 定義

  • RxJavaGitHub 的介紹:
RxJava:a library for composing asynchronous and event-based programs using observable sequences for the Java VM
// 翻譯:RxJava 是一個在 Java VM 上使用可觀測的序列來組成異步的映挂、基于事件的程序的庫

  • 總結(jié):RxJava 是一個 基于事件流泽篮、實現(xiàn)異步操作的庫

2. 作用

實現(xiàn)異步操作

類似于 Android中的 AsyncTaskHandler作用


3. 特點

由于 RxJava的使用方式是:基于事件流的鏈?zhǔn)秸{(diào)用柑船,所以使得 RxJava

  • 邏輯簡潔
  • 實現(xiàn)優(yōu)雅
  • 使用簡單

更重要的是帽撑,隨著程序邏輯的復(fù)雜性提高,它依然能夠保持簡潔 & 優(yōu)雅


4. 原理

4.1 生活例子引入

  • 我用一個生活例子引入 & 講解 Rxjava原理: 顧客到飯店吃飯
示意圖
流程圖

4.2 Rxjava原理介紹

  • Rxjava原理 基于 一種擴(kuò)展的觀察者模式

  • Rxjava的擴(kuò)展觀察者模式中有4個角色:

角色 作用 類比
被觀察者(Observable) 產(chǎn)生事件 顧客
觀察者(Observer) 接收事件鞍时,并給出響應(yīng)動作 廚房
訂閱(Subscribe) 連接 被觀察者 & 觀察者 服務(wù)員
事件(Event) 被觀察者 & 觀察者 溝通的載體 菜式
  • 具體原理

請結(jié)合上述 顧客到飯店吃飯 的生活例子理解:

示意圖
流程圖

RxJava原理可總結(jié)為:被觀察者 (Observable) 通過 訂閱(Subscribe) 按順序發(fā)送事件 給觀察者 (Observer)油狂, 觀察者(Observer) 按順序接收事件 & 作出對應(yīng)的響應(yīng)動作。具體如下圖:

示意圖

至此寸癌,RxJava原理講解完畢专筷。


5. 基本使用

  • 本文只關(guān)注 RxJava的基本使用,更深入的RxJava使用請繼續(xù)關(guān)注Carson_Ho的RxJava系列
  • Rxjava的使用方式有兩種:
    1. 分步驟實現(xiàn):該方法主要為了深入說明Rxjava的原理 & 使用蒸苇,主要用于演示說明
    2. 基于事件流的鏈?zhǔn)秸{(diào)用:主要用于實際使用

5.1 方式1:分步驟實現(xiàn)

5.1.1 使用步驟
示意圖
5.1.2 步驟詳解
步驟1:創(chuàng)建被觀察者 (Observable )& 生產(chǎn)事件
  • 即 顧客入飯店 - 坐下餐桌 - 點菜
  • 具體實現(xiàn)
        // 1\. 創(chuàng)建被觀察者 Observable 對象
        Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
          // create() 是 RxJava 最基本的創(chuàng)造事件序列的方法
          // 此處傳入了一個 OnSubscribe 對象參數(shù)
          // 當(dāng) Observable 被訂閱時磷蛹,OnSubscribe 的 call() 方法會自動被調(diào)用,即事件序列就會依照設(shè)定依次被觸發(fā)
          // 即觀察者會依次調(diào)用對應(yīng)事件的復(fù)寫方法從而響應(yīng)事件
          // 從而實現(xiàn)被觀察者調(diào)用了觀察者的回調(diào)方法 & 由被觀察者向觀察者的事件傳遞溪烤,即觀察者模式

        // 2\. 在復(fù)寫的subscribe()里定義需要發(fā)送的事件
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                // 通過 ObservableEmitter類對象產(chǎn)生事件并通知觀察者
                // ObservableEmitter類介紹
                    // a. 定義:事件發(fā)射器
                    // b. 作用:定義需要發(fā)送的事件 & 向觀察者發(fā)送事件
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        });

<--擴(kuò)展:RxJava 提供了其他方法用于 創(chuàng)建被觀察者對象Observable -->
// 方法1:just(T...):直接將傳入的參數(shù)依次發(fā)送出來
  Observable observable = Observable.just("A", "B", "C");
  // 將會依次調(diào)用:
  // onNext("A");
  // onNext("B");
  // onNext("C");
  // onCompleted();

// 方法2:from(T[]) / from(Iterable<? extends T>) : 將傳入的數(shù)組 / Iterable 拆分成具體對象后味咳,依次發(fā)送出來
  String[] words = {"A", "B", "C"};
  Observable observable = Observable.from(words);
  // 將會依次調(diào)用:
  // onNext("A");
  // onNext("B");
  // onNext("C");
  // onCompleted();

步驟2:創(chuàng)建觀察者 (Observer )并 定義響應(yīng)事件的行為
  • 即 開廚房 - 確定對應(yīng)菜式
  • 發(fā)生的事件類型包括:Next事件、Complete事件 & Error事件檬嘀。具體如下:
示意圖
  • 具體實現(xiàn)

<--方式1:采用Observer 接口 -->
        // 1\. 創(chuàng)建觀察者 (Observer )對象
        Observer<Integer> observer = new Observer<Integer>() {
        // 2\. 創(chuàng)建對象時通過對應(yīng)復(fù)寫對應(yīng)事件方法 從而 響應(yīng)對應(yīng)事件

            // 觀察者接收事件前槽驶,默認(rèn)最先調(diào)用復(fù)寫 onSubscribe()
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始采用subscribe連接");
            }

            // 當(dāng)被觀察者生產(chǎn)Next事件 & 觀察者接收到時,會調(diào)用該復(fù)寫方法 進(jìn)行響應(yīng)
            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件作出響應(yīng)" + value);
            }

            // 當(dāng)被觀察者生產(chǎn)Error事件& 觀察者接收到時鸳兽,會調(diào)用該復(fù)寫方法 進(jìn)行響應(yīng)
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應(yīng)");
            }

            // 當(dāng)被觀察者生產(chǎn)Complete事件& 觀察者接收到時掂铐,會調(diào)用該復(fù)寫方法 進(jìn)行響應(yīng)
            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應(yīng)");
            }
        };

<--方式2:采用Subscriber 抽象類 -->
// 說明:Subscriber類 = RxJava 內(nèi)置的一個實現(xiàn)了 Observer 的抽象類,對 Observer 接口進(jìn)行了擴(kuò)展

// 1\. 創(chuàng)建觀察者 (Observer )對象
Subscriber<String> subscriber = new Subscriber<Integer>() {

// 2\. 創(chuàng)建對象時通過對應(yīng)復(fù)寫對應(yīng)事件方法 從而 響應(yīng)對應(yīng)事件
            // 觀察者接收事件前揍异,默認(rèn)最先調(diào)用復(fù)寫 onSubscribe()
            @Override
            public void onSubscribe(Subscription s) {
                Log.d(TAG, "開始采用subscribe連接");
            }

            // 當(dāng)被觀察者生產(chǎn)Next事件 & 觀察者接收到時全陨,會調(diào)用該復(fù)寫方法 進(jìn)行響應(yīng)
            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件作出響應(yīng)" + value);
            }

            // 當(dāng)被觀察者生產(chǎn)Error事件& 觀察者接收到時,會調(diào)用該復(fù)寫方法 進(jìn)行響應(yīng)
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應(yīng)");
            }

            // 當(dāng)被觀察者生產(chǎn)Complete事件& 觀察者接收到時衷掷,會調(diào)用該復(fù)寫方法 進(jìn)行響應(yīng)
            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應(yīng)");
            }
        };

<--特別注意:2種方法的區(qū)別辱姨,即Subscriber 抽象類與Observer 接口的區(qū)別 -->
// 相同點:二者基本使用方式完全一致(實質(zhì)上,在RxJava的 subscribe 過程中戚嗅,Observer總是會先被轉(zhuǎn)換成Subscriber再使用)
// 不同點:Subscriber抽象類對 Observer 接口進(jìn)行了擴(kuò)展雨涛,新增了兩個方法:
    // 1\. onStart():在還未響應(yīng)事件前調(diào)用,用于做一些初始化工作
    // 2\. unsubscribe():用于取消訂閱懦胞。在該方法被調(diào)用后替久,觀察者將不再接收 & 響應(yīng)事件
    // 調(diào)用該方法前,先使用 isUnsubscribed() 判斷狀態(tài)医瘫,確定被觀察者Observable是否還持有觀察者Subscriber的引用渣叛,如果引用不能及時釋放碉碉,就會出現(xiàn)內(nèi)存泄露

步驟3:通過訂閱(Subscribe)連接觀察者和被觀察者
  • 即 顧客找到服務(wù)員 - 點菜 - 服務(wù)員下單到廚房 - 廚房烹調(diào)
  • 具體實現(xiàn)
observable.subscribe(observer);
 // 或者 observable.subscribe(subscriber)哀蘑;

  • 擴(kuò)展說明
<-- Observable.subscribe(Subscriber) 的內(nèi)部實現(xiàn) -->

public Subscription subscribe(Subscriber subscriber) {
    subscriber.onStart();
    // 步驟1中 觀察者  subscriber抽象類復(fù)寫的方法,用于初始化工作
    onSubscribe.call(subscriber);
    // 通過該調(diào)用丈攒,從而回調(diào)觀察者中的對應(yīng)方法從而響應(yīng)被觀察者生產(chǎn)的事件
    // 從而實現(xiàn)被觀察者調(diào)用了觀察者的回調(diào)方法 & 由被觀察者向觀察者的事件傳遞,即觀察者模式
    // 同時也看出:Observable只是生產(chǎn)事件嫂便,真正的發(fā)送事件是在它被訂閱的時候念赶,即當(dāng) subscribe() 方法執(zhí)行時
}

5.2 方式2:優(yōu)雅的實現(xiàn)方法 - 基于事件流的鏈?zhǔn)秸{(diào)用

  • 上述的實現(xiàn)方式是為了說明Rxjava的原理 & 使用
  • 在實際應(yīng)用中,會將上述步驟&代碼連在一起怖竭,從而更加簡潔锥债、更加優(yōu)雅,即所謂的 RxJava基于事件流的鏈?zhǔn)秸{(diào)用
// RxJava的鏈?zhǔn)讲僮?        Observable.create(new ObservableOnSubscribe<Integer>() {
        // 1\. 創(chuàng)建被觀察者 & 生產(chǎn)事件
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        }).subscribe(new Observer<Integer>() {
            // 2\. 通過通過訂閱(subscribe)連接觀察者和被觀察者
            // 3\. 創(chuàng)建觀察者 & 定義響應(yīng)事件的行為
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始采用subscribe連接");
            }
            // 默認(rèn)最先調(diào)用復(fù)寫的 onSubscribe()

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件"+ value +"作出響應(yīng)"  );
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應(yīng)");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應(yīng)");
            }

        });
    }
}

注:整體方法調(diào)用順序:觀察者.onSubscribe()> 被觀察者.subscribe()> 觀察者.onNext()>觀察者.onComplete() 

這種 基于事件流的鏈?zhǔn)秸{(diào)用痊臭,使得RxJava

  • 邏輯簡潔
  • 實現(xiàn)優(yōu)雅
  • 使用簡單

更重要的是哮肚,隨著程序邏輯的復(fù)雜性提高,它依然能夠保持簡潔 & 優(yōu)雅广匙。所以允趟,一般建議使用這種基于事件流的鏈?zhǔn)秸{(diào)用方式實現(xiàn)RxJava

特別注意

RxJava 2.x 提供了多個函數(shù)式接口 鸦致,用于實現(xiàn)簡便式的觀察者模式潮剪。具體如下:

示意圖

Consumer為例:實現(xiàn)簡便式的觀察者模式

Observable.just("hello").subscribe(new Consumer<String>() {
            // 每次接收到Observable的事件都會調(diào)用Consumer.accept()
            @Override
            public void accept(String s) throws Exception {
                System.out.println(s);
            }
        });


6. 實例說明

我將用一個實際工程實例來演示 Rxjava的使用

6.1 方式1:分步驟實現(xiàn)

步驟1:加入依賴

    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

步驟2:直接在MainActivity.java中實現(xiàn)下述步驟

  1. 創(chuàng)建被觀察者 (Observable )& 生產(chǎn)事件
  2. 創(chuàng)建觀察者 (Observer )并 定義響應(yīng)事件的行為
  3. 通過訂閱(Subscribe)連接觀察者和被觀察者
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Rxjava";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// 步驟1:創(chuàng)建被觀察者 Observable & 生產(chǎn)事件
// 即 顧客入飯店 - 坐下餐桌 - 點菜

        //  1\. 創(chuàng)建被觀察者 Observable 對象
        Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            // 2\. 在復(fù)寫的subscribe()里定義需要發(fā)送的事件
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                // 通過 ObservableEmitter類對象產(chǎn)生事件并通知觀察者
                // ObservableEmitter類介紹
                    // a. 定義:事件發(fā)射器
                    // b. 作用:定義需要發(fā)送的事件 & 向觀察者發(fā)送事件
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        });

// 步驟2:創(chuàng)建觀察者 Observer 并 定義響應(yīng)事件行為
// 即 開廚房 - 確定對應(yīng)菜式

        Observer<Integer> observer = new Observer<Integer>() {
            // 通過復(fù)寫對應(yīng)方法來 響應(yīng) 被觀察者
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始采用subscribe連接");
            }
            // 默認(rèn)最先調(diào)用復(fù)寫的 onSubscribe()

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件"+ value +"作出響應(yīng)"  );
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應(yīng)");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應(yīng)");
            }
        };

        // 步驟3:通過訂閱(subscribe)連接觀察者和被觀察者
        // 即 顧客找到服務(wù)員 - 點菜 - 服務(wù)員下單到廚房 - 廚房烹調(diào)
        observable.subscribe(observer);

  • 測試結(jié)果
示意圖

6.2 方式2:基于事件流的鏈?zhǔn)秸{(diào)用方式

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Rxjava";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// RxJava的流式操作
        Observable.create(new ObservableOnSubscribe<Integer>() {
        // 1\. 創(chuàng)建被觀察者 & 生產(chǎn)事件
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        }).subscribe(new Observer<Integer>() {
            // 2\. 通過通過訂閱(subscribe)連接觀察者和被觀察者
            // 3\. 創(chuàng)建觀察者 & 定義響應(yīng)事件的行為
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始采用subscribe連接");
            }
            // 默認(rèn)最先調(diào)用復(fù)寫的 onSubscribe()

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件"+ value +"作出響應(yīng)"  );
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應(yīng)");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應(yīng)");
            }

        });
    }
}

  • 測試效果
    實現(xiàn)效果同上
示意圖

7. 額外說明

7.1 被觀察者 Observable的subscribe()具備多個重載的方法

    public final Disposable subscribe() {}
    // 表示觀察者不對被觀察者發(fā)送的事件作出任何響應(yīng)(但被觀察者還是可以繼續(xù)發(fā)送事件)

    public final Disposable subscribe(Consumer<? super T> onNext) {}
    // 表示觀察者只對被觀察者發(fā)送的Next事件作出響應(yīng)
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {} 
    // 表示觀察者只對被觀察者發(fā)送的Next事件 & Error事件作出響應(yīng)

    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
    // 表示觀察者只對被觀察者發(fā)送的Next事件、Error事件 & Complete事件作出響應(yīng)

    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
    // 表示觀察者只對被觀察者發(fā)送的Next事件分唾、Error事件 抗碰、Complete事件 & onSubscribe事件作出響應(yīng)

    public final void subscribe(Observer<? super T> observer) {}
    // 表示觀察者對被觀察者發(fā)送的任何事件都作出響應(yīng)

7.2 可采用 Disposable.dispose() 切斷觀察者 與 被觀察者 之間的連接

  • 即觀察者 無法繼續(xù) 接收 被觀察者的事件,但被觀察者還是可以繼續(xù)發(fā)送事件
  • 具體使用

// 主要在觀察者 Observer中 實現(xiàn)
        Observer<Integer> observer = new Observer<Integer>() {
            // 1\. 定義Disposable類變量
            private Disposable mDisposable;

            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "開始采用subscribe連接");
                // 2\. 對Disposable類變量賦值
                mDisposable = d;
            }

            @Override
            public void onNext(Integer value) {
                Log.d(TAG, "對Next事件"+ value +"作出響應(yīng)"  );
                if (value == 2) {
                    // 設(shè)置在接收到第二個事件后切斷觀察者和被觀察者的連接
                    mDisposable.dispose();
                    Log.d(TAG, "已經(jīng)切斷了連接:" + mDisposable.isDisposed());
                }
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "對Error事件作出響應(yīng)");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應(yīng)");
            }
        };

  • 效果圖
示意圖

8. 總結(jié)

示意圖

本文轉(zhuǎn)載自此處:http://www.reibang.com/p/a406b94f3188
作者:Carson_Ho
來源:簡書
著作權(quán)歸作者所有绽乔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弧蝇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子折砸,更是在濱河造成了極大的恐慌捍壤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞍爱,死亡現(xiàn)場離奇詭異鹃觉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睹逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門盗扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沉填,你說我怎么就攤上這事疗隶。” “怎么了翼闹?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵斑鼻,是天一觀的道長。 經(jīng)常有香客問我猎荠,道長坚弱,這世上最難降的妖魔是什么蜀备? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮荒叶,結(jié)果婚禮上碾阁,老公的妹妹穿的比我還像新娘。我一直安慰自己些楣,他們只是感情好脂凶,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愁茁,像睡著了一般蚕钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅很,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天嘶居,我揣著相機(jī)與錄音,去河邊找鬼道宅。 笑死食听,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的污茵。 我是一名探鬼主播樱报,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泞当!你這毒婦竟也來了迹蛤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤襟士,失蹤者是張志新(化名)和其女友劉穎盗飒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陋桂,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逆趣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗜历。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣渗。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梨州,靈堂內(nèi)的尸體忽然破棺而出痕囱,到底是詐尸還是另有隱情,我是刑警寧澤暴匠,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布鞍恢,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帮掉。R本人自食惡果不足惜弦悉,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旭寿。 院中可真熱鬧警绩,春花似錦崇败、人聲如沸盅称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缩膝。三九已至,卻和暖如春岸霹,著一層夾襖步出監(jiān)牢的瞬間疾层,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工贡避, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留痛黎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓刮吧,卻偏偏與公主長得像湖饱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杀捻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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