Jetpack-Lifecycle 原理解析

介紹

Lifecycle 它是 Jetpack 組件庫的的核心基礎(chǔ) 甸各,具備宿主生命周期感知能力的組件团甲。它能持有組件(如 Activity 或 Fragment)生命周期狀態(tài)的信息溉贿,并且允許其他觀察者監(jiān)聽宿主的狀態(tài)仑嗅,大大減少了業(yè)務(wù)代碼發(fā)生內(nèi)存泄漏和 NPE 的風(fēng)險,LiveData 痹束、 ViewModel 組件等也都是基于它來實現(xiàn)的(觀察者模式)

Google developer 介紹

工程引入

 implementation 'androidx.appcompat:appcompat:1.1.0'
 //或者
 implementation "androidx.lifecycle:lifecycle-common:2.2.0"
 implementation "androidx.lifecycle:lifecycle-common-java8:2.2.0"
 implementation "androidx.lifecycle:lifecycle-runtime:2.2.0"

Lifecycle觀察宿主

每當(dāng) Activity/Fragment 的生命周期函數(shù)被觸發(fā)時检疫,該接口的相應(yīng)同名函數(shù)就會在之前或者之后被調(diào)用,以此來獲得相應(yīng)生命周期事件變化的通知

//使用案例
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onCreate(owner: LifecycleOwner) {}

            override fun onResume(owner: LifecycleOwner) {}

            override fun onDestroy(owner: LifecycleOwner) {}
        })
    }

實現(xiàn)原理源碼分析

一祷嘶、Activity 實現(xiàn) Lifecycle

  • LifecycleOwner 接口用于標(biāo)記其實現(xiàn)類具備 Lifecycle 對象
    ComponentActivityFragment 都實現(xiàn)了該接口
 public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
 }
 
 class ComponentActivity implements LifecycleOwner{
 
    //LifecycleRegistry觀察者添加和事件分發(fā)  
   private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
      @NonNull
      @Override
      public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
      }

      @SuppressLint("RestrictedApi")
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //往Activity上添加一個fragment,用以監(jiān)聽生命周期的變化
           //其目的是為了兼顧不是繼承自AppCompactActivity的場景.
            ReportFragment.injectIfNeededIn(this);
      }

     public ComponentActivity() {
         //添加觀察者
         getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source,
                    @NonNull Lifecycle.Event event) {
            }
        });
    }
} 
  • Lifecycle接口Lifecycle 聲明了 添加觀察者 移除觀察者等相關(guān)函數(shù)(抽象)
public abstract class Lifecycle {

  @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
  @NonNull
  AtomicReference<Object> mInternalScopeRef = new AtomicReference<>();
  
  @MainThread 
  public abstract void addObserver(@NonNull LifecycleObserver observer);

  @MainThread
  public abstract void removeObserver(@NonNull LifecycleObserver observer);

  @MainThread
  @NonNull
  public abstract State getCurrentState();
}
  • Event類(Lifecycle內(nèi)部靜態(tài)類)用于抽象 Activity/Fragment 的生命周期事件發(fā)生變化時所觸發(fā)的事件屎媳。例如,當(dāng) Activity 的每個生命周期事件回調(diào)函數(shù)(onCreate论巍、onStart 等)被觸發(fā)時都會被抽象為相應(yīng)的 ON_CREATE烛谊、ON_START 兩個 Event
public enum Event {     
   ON_CREATE,      
   ON_START,      
   ON_RESUME,    
   ON_PAUSE,      
   ON_STOP,      
   ON_DESTROY,    
   ON_ANY  
}
  • State(Lifecycle內(nèi)部靜態(tài)類) 類用于標(biāo)記 Lifecycle 的當(dāng)前生命周期狀態(tài)
public enum State {        
  //當(dāng)處于 DESTROYED 狀態(tài)時,Lifecycle 將不會發(fā)布其它 Event 值       
  //當(dāng) Activity 即將回調(diào) onDestory 時則處于此狀態(tài)       
  DESTROYED,        
  //已初始化的狀態(tài)嘉汰。例如丹禀,當(dāng) Activity 的構(gòu)造函數(shù)已完成,
  //但還未回調(diào) onCreate 時則處于此狀態(tài)        
  INITIALIZED,   
  CREATED,       
  STARTED,        
  RESUMED;                
  //如果當(dāng)前狀態(tài)大于入?yún)⒅?state 時鞋怀,則返回 true    
  public boolean isAtLeast(@NonNull State state) {            
      return compareTo(state) >= 0;       
    } 
}
  • LifecycleRegistry 觀察者添加和事件分發(fā)
public class LifecycleRegistry extends Lifecycle {
  private FastSafeIterableMap<LifecycleObserver, ObserverWithState>       
                   mObserverMap =new FastSafeIterableMap<>();
  //一般一個 LifecycleRegistry 對應(yīng)一個 LifecycleOwner 對象(Activity/Fragment等)
  //mState 就用來標(biāo)記 LifecycleOwner 對象所處的當(dāng)前生命周期狀態(tài)
  private State mState;
  // 持有對 LifecycleOwner 的弱引用双泪,避免內(nèi)存泄露
  private final WeakReference<LifecycleOwner> mLifecycleOwner;

  public LifecycleRegistry(@NonNull LifecycleOwner provider) {
    mLifecycleOwner = new WeakReference<>(provider);
    mState = INITIALIZED;
  }
}
  • LifecycleRegistry addObserver 添加觀察者 將觀察者包裝成ObserverWithState 對象 存儲到 mObserverMap
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
    //添加新的Observer時,會首先根據(jù)宿主的狀態(tài)計算出它的初始狀態(tài)接箫,只要不是在onDestroy中注冊
   // 的攒读,它的初始狀態(tài)都是INITIALIZED
    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
    //接著會把observer包裝成ObserverWithState,這個類主要是包含了觀察者及其狀態(tài)辛友。每個事
    //件都會經(jīng)由這個對象類轉(zhuǎn)發(fā),這個類后面會來分析
    ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
    //添加到集合,如果之前已經(jīng)添加過了,則return
    if (previous != null) {
        return;
    }
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
    if (lifecycleOwner == null) {
        // it is null we should be destroyed. Fallback quickly
        //如果 LifecycleOwner 對象已經(jīng)被回收了废累,則直接返回
        return;
    }
    //如果 isReentrance 為 true邓梅,則說明此時以下兩種情況至少有一個成立:     
    //1. mAddingObserverCounter != 0。會出現(xiàn)這種情況邑滨,是由于開發(fā)者先添加了一個        
    //   LifecycleObserver 日缨,當(dāng)還在向其回調(diào)事件的過程中,
    //在回調(diào)函數(shù)里又再次調(diào)用了 addObserver 方法添加了一個新的 LifecycleObserver       
   //2.mHandlingEvent 為 true掖看。即此時正處于向外回調(diào) Lifecycle.Event 的狀態(tài)

    boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
    State targetState = calculateTargetState(observer);
    //遞增加一匣距,標(biāo)記當(dāng)前正處于向新添加的 LifecycleObserver 回調(diào) Event 值的過程
    mAddingObserverCounter++;
     
    //拿觀察者的狀態(tài)和宿主當(dāng)前狀態(tài)做比較,如果小于0哎壳,說明兩者狀態(tài)還沒有對齊
    while ((statefulObserver.mState.compareTo(targetState) < 0
            && mObserverMap.contains(observer))) {
        //將 observer 已經(jīng)遍歷到的當(dāng)前的狀態(tài)值 mState 保存下來
        pushParentState(statefulObserver.mState);
        //向 observer 回調(diào)進(jìn)入“statefulObserver.mState”前需要收到的 Event 值
        statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
       //移除 mState
        popParentState();
        // mState / subling may have been changed recalculate
        targetState = calculateTargetState(observer);
    }

    if (!isReentrance) {
        // we do sync only on the top level.
        sync();
    }
    mAddingObserverCounter--;
}
  • ObserverWithState 將外界傳入的 LifecycleObserver 對象傳給 Lifecycling 進(jìn)行類型包裝毅待,將反射邏輯和接口回調(diào)邏輯都給匯總綜合成一個新的 LifecycleEventObserver 對象,從而使得 Event 分發(fā)過程都統(tǒng)一為一個入口
static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            mState = initialState;
        }

        void dispatchEvent(LifecycleOwner owner, Event event) {
            //再一次根據(jù)需要分發(fā)的事件類型反推出該觀察者的狀態(tài)
            State newState = getStateAfter(event);
            mState = min(mState, newState);
            //把事件分發(fā)給被包裝的對象归榕,完成本次流程尸红。
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }
    
 //再一次根據(jù)需要分發(fā)的事件類型反推出該觀察者的狀態(tài),這樣的好處是事件與狀態(tài)對應(yīng),不會出現(xiàn)跳躍   
static State getStateAfter(Event event) {
        switch (event) {
            case ON_CREATE:
            case ON_STOP:
                return CREATED;
            case ON_START:
            case ON_PAUSE:
                return STARTED;
            case ON_RESUME:
                return RESUMED;
            case ON_DESTROY:
                return DESTROYED;
            case ON_ANY:
                break;
        }
        throw new IllegalArgumentException("Unexpected event value " + event);
    }    
  • Lifecycling.lifecycleEventObserver 獲取觀察者對象類型 根據(jù)傳入的不同觀察者對象類型返回不同的觀察者對象
 @NonNull
    static LifecycleEventObserver lifecycleEventObserver(Object object) {
        boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
        boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
        if (isLifecycleEventObserver && isFullLifecycleObserver) {
            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
                    (LifecycleEventObserver) object);
        }
        
        if (isFullLifecycleObserver) {
            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
        }
        
        if (isLifecycleEventObserver) {
            return (LifecycleEventObserver) object;
        }
    ......一些反射邏輯....
}        
  • LifecycleEventObserverFullLifecycleObserver 都實現(xiàn)了 LifecycleObserver (Java多態(tài))
public interface LifecycleObserver {

}

public interface LifecycleEventObserver extends LifecycleObserver {

    void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}
  • FullLifecycleObserverAdapter 實現(xiàn)了 LifecycleEventObserver 接口刹泄,用于在收到 Lifecycle 生命周期事件狀態(tài)變化時外里,對其兩個構(gòu)造函數(shù)參數(shù)( FullLifecycleObserverLifecycleEventObserver)進(jìn)行生命周期事件做轉(zhuǎn)發(fā)
class FullLifecycleObserverAdapter implements LifecycleEventObserver {

    private final FullLifecycleObserver mFullLifecycleObserver;
    private final LifecycleEventObserver mLifecycleEventObserver;

    FullLifecycleObserverAdapter(FullLifecycleObserver fullLifecycleObserver,
            LifecycleEventObserver lifecycleEventObserver) {
        mFullLifecycleObserver = fullLifecycleObserver;
        mLifecycleEventObserver = lifecycleEventObserver;
    }
    //進(jìn)行生命周期事件轉(zhuǎn)發(fā)
    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        switch (event) {
            case ON_CREATE:
                mFullLifecycleObserver.onCreate(source);
                break;
            case ON_START:
                mFullLifecycleObserver.onStart(source);
                break;
            case ON_RESUME:
                mFullLifecycleObserver.onResume(source);
                break;
            case ON_PAUSE:
                mFullLifecycleObserver.onPause(source);
                break;
            case ON_STOP:
                mFullLifecycleObserver.onStop(source);
                break;
            case ON_DESTROY:
                mFullLifecycleObserver.onDestroy(source);
                break;
            case ON_ANY:
                throw new IllegalArgumentException("ON_ANY must not been send by anybody");
        }
        if (mLifecycleEventObserver != null) {
            mLifecycleEventObserver.onStateChanged(source, event);
        }
    }
}
  • 以上對如何添加觀察者以及這些觀察者如何接受宿主生命周期變更事件做了分析特石,接下來分析宿主的生命周期變更是怎么分發(fā)出去的 還記得ComponentActivity中添加的那個ReportFragment
 class ComponentActivity implements LifecycleOwner{
 
    //LifecycleRegistry觀察者添加和事件分發(fā)  
   private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
      @NonNull
      @Override
      public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
      }

      @SuppressLint("RestrictedApi")
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //往Activity上添加一個fragment,用以監(jiān)聽生命周期的變化
           //其目的是為了兼顧不是繼承自AppCompactActivity的場景.
            ReportFragment.injectIfNeededIn(this);
      }
}
  • ReportFragment 獲取到 AppCompatActivity 的事件變化通知盅蝗,最終調(diào)用 LifecycleRegistryhandleLifecycleEvent(Lifecycle.Event) 方法將 Lifecycle.Event 傳遞出去。此時姆蘸,LifecycleRegistry 就拿到了 Lifecycle.Event
public class ReportFragment extends Fragment {
   //添加到Activity
   public static void injectIfNeededIn(Activity activity) {
      android.app.FragmentManager manager = activity.getFragmentManager();
      if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
          manager.beginTransaction().add(new ReportFragment(),    
          REPORT_FRAGMENT_TAG).commit();
          // Hopefully, we are the first to make a transaction.
          manager.executePendingTransactions();
      }
   }

   private void dispatch(Lifecycle.Event event) {
      Activity activity = getActivity();
      if (activity instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) 
          activity).getLifecycle().handleLifecycleEvent(event);
        return;
      }

      if (activity instanceof LifecycleOwner) {
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
     }
   }
  
   @Override
   public void onActivityCreated(Bundle savedInstanceState) {
      super.onActivityCreated(savedInstanceState);
      dispatch(Lifecycle.Event.ON_CREATE);
   }

   @Override
   public void onStart() {
      super.onStart();
      dispatch(Lifecycle.Event.ON_START);
   }

   @Override
   public void onResume() {
    super.onResume();
    dispatch(Lifecycle.Event.ON_RESUME);
  }

  @Override
  public void onPause() {
    super.onPause();
    dispatch(Lifecycle.Event.ON_PAUSE);
  }

  @Override
  public void onStop() {
    super.onStop();
    dispatch(Lifecycle.Event.ON_STOP);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    dispatch(Lifecycle.Event.ON_DESTROY);
  }
}
  • 分發(fā)宿狀態(tài)的 handleLifecycleEvent 該方法會根據(jù)接收到的 Event 值換算出對應(yīng)的 State 值墩莫,然后更新本地的 mState,再向所有 Observer 進(jìn)行事件通知乞旦,最終還是會調(diào)用到 ObserverWithStatedispatchEvent 方法贼穆,所以后邊重點關(guān)注 dispatchEvent 方法即可
public class LifecycleRegistry extends Lifecycle {
  private FastSafeIterableMap<LifecycleObserver, ObserverWithState>       
                   mObserverMap =new FastSafeIterableMap<>();

   public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
    //根據(jù)接收到的 Event 值換算出對應(yīng)的 State 值
    State next = getStateAfter(event);
    moveToState(next);
   }

   private void moveToState(State next) {
    if (mState == next) {
        return;
    }
    mState = next;
    if (mHandlingEvent || mAddingObserverCounter != 0) {
        mNewEventOccurred = true;
        // we will figure out what to do on upper level.
        return;
    }
    mHandlingEvent = true;
    sync();
    mHandlingEvent = false;
  }
}
  • sync() 宿主生命周期狀態(tài)同步和分發(fā)
private void sync() {
        //mLifecycleOwner.get() 獲取到的是宿主(Activity/Fragment)
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                    + "garbage collected. It is too late to change lifecycle state.");
        }
        while (!isSynced()) {
            mNewEventOccurred = false;
             //如果宿主當(dāng)前轉(zhuǎn)態(tài) 小于 mObserverMap集合中最先添加的那個觀察者的狀態(tài)
            //則說明宿主可能發(fā)生了狀態(tài)回退,比如當(dāng)前是RESUMED狀態(tài)兰粉,執(zhí)行了onPause則回退到
            //STARTED狀態(tài)
           //此時調(diào)用backwardPass把集合中的每個一觀察者分發(fā)一個on_pause事件故痊,并同步它的狀態(tài)。
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            //如果宿主當(dāng)前轉(zhuǎn)態(tài) 大于 mObserverMap集合中最先添加的那個觀察者的狀態(tài)
        //則說明宿主可能發(fā)生了狀態(tài)前進(jìn)玖姑,比如當(dāng)前是STARTED狀態(tài)愕秫,執(zhí)行了onResume則前進(jìn)到
        //RESUMED狀態(tài)
        //此時調(diào)用forwardPass把集合中的每個一觀察者分發(fā)一個on_resume事件,并同步它的狀態(tài)焰络。
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }
  • backwardPassforwardPass 遍歷Map中保存的觀察者 進(jìn)行事件分發(fā)
    注意mNewEventOccurred 這個boolean值開關(guān) 是在有新的事件過來時能及時終止
    while循環(huán)分發(fā)沒有意義的事件
 private void backwardPass(LifecycleOwner lifecycleOwner) {
     Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
            mObserverMap.descendingIterator();
     while (descendingIterator.hasNext() && !mNewEventOccurred) {
        Entry<LifecycleObserver, ObserverWithState> entry = 
        descendingIterator.next();
        ObserverWithState observer = entry.getValue();
        while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            Event event = downEvent(observer.mState);
            pushParentState(getStateAfter(event));
            //生命周期事件分發(fā)
            observer.dispatchEvent(lifecycleOwner, event);
            popParentState();
        }
    }
   }

二戴甩、 Fragment 實現(xiàn) Lifecycle Fragment的實現(xiàn)和add到 AppCompatActivity中的 ReportFragment就打同小異了 一看就明白

public class Fragment implements LifecycleOwner{

   LifecycleRegistry mLifecycleRegistry;

   public Fragment() {
    initLifecycle();
   }
   
   private void initLifecycle() {
    mLifecycleRegistry = new LifecycleRegistry(this);
    if (Build.VERSION.SDK_INT >= 19) {
        mLifecycleRegistry.addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source,
                    @NonNull Lifecycle.Event event) {
                if (event == Lifecycle.Event.ON_STOP) {
                    if (mView != null) {
                        mView.cancelPendingInputEvents();
                    }
                }
            }
        });
    }
  }

  @Override
  @NonNull
   public Lifecycle getLifecycle() {
    return mLifecycleRegistry;
   }
   //事件分發(fā)
  void performCreate(){
     mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
  }
  
   void performStart(){
     mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
   }

   void performResume(){
     mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
   }  
}

總結(jié)

  • LifecycleOwner: Activity/Fragment 都實現(xiàn)了該接口,用以聲明它是一個能夠提供生命周期事件的宿主闪彼。同時必須復(fù)寫getLifecycle()方法提供一個Lifecycle對象
  • Lifecycle:是一個抽象類甜孤,里面定義了兩個枚舉State宿主的狀態(tài)协饲,Event 需要分發(fā)的事件的類型
  • LifecycleRegistry: 是 Lifecycle 的唯一實現(xiàn)類,主要用來負(fù)責(zé)注冊 Observer(觀察者)缴川,以及分發(fā)宿主狀態(tài)事件給它們


    1610167303751.jpg

使用場景介紹

對平時開發(fā)中需要感知(Fragment/Activity)生命周期邏輯的地方 可以繼承LifecycleEventObserver或者 DefaultLifecycleObserver 并添加到 (Fragment/Activity)的 LifecycleRegistry中來觀察 (Fragment/Activity)生命周期的變化 而做出對應(yīng)的業(yè)務(wù)邏輯變化 (Ps:以前我們可能是在BaseActivity 或者BaseFragment的onStart()和onStop()添加對應(yīng)生命周期相關(guān)的邏輯 )

class LocationObserver extends DefaultLifecycleObserver{
    //宿主執(zhí)行了onstart時茉稠,會分發(fā)該事件
    void onStart(@NotNull LifecycleOwner owner){
        //開啟定位
    }
  
   //宿主執(zhí)行了onstop時 會分發(fā)該事件
   void onStop(@NotNull LifecycleOwner owner){
       //停止定位
   }
}
//2. 注冊觀察者,觀察宿主生命周期狀態(tài)變化
class MyFragment extends Fragment{
  public void onCreate(Bundle bundle){
    LocationObserver observer =new LocationObserver()
    //添加觀察者
    getLifecycle().addObserver(observer);
  }
 }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市把夸,隨后出現(xiàn)的幾起案子而线,更是在濱河造成了極大的恐慌,老刑警劉巖恋日,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膀篮,死亡現(xiàn)場離奇詭異,居然都是意外死亡岂膳,警方通過查閱死者的電腦和手機(jī)誓竿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闷营,“玉大人烤黍,你說我怎么就攤上這事∩得耍” “怎么了速蕊?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娘赴。 經(jīng)常有香客問我规哲,道長,這世上最難降的妖魔是什么诽表? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任唉锌,我火速辦了婚禮,結(jié)果婚禮上竿奏,老公的妹妹穿的比我還像新娘袄简。我一直安慰自己,他們只是感情好泛啸,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布绿语。 她就那樣靜靜地躺著,像睡著了一般候址。 火紅的嫁衣襯著肌膚如雪吕粹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天岗仑,我揣著相機(jī)與錄音匹耕,去河邊找鬼。 笑死荠雕,一個胖子當(dāng)著我的面吹牛稳其,可吹牛的內(nèi)容都是我干的驶赏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欢际,長吁一口氣:“原來是場噩夢啊……” “哼母市!你這毒婦竟也來了矾兜?” 一聲冷哼從身側(cè)響起损趋,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椅寺,沒想到半個月后浑槽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡返帕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年桐玻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荆萤。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镊靴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出链韭,到底是詐尸還是另有隱情偏竟,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布敞峭,位于F島的核電站踊谋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旋讹。R本人自食惡果不足惜殖蚕,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沉迹。 院中可真熱鬧睦疫,春花似錦、人聲如沸鞭呕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琅拌。三九已至缨伊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間进宝,已是汗流浹背刻坊。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留党晋,地道東北人谭胚。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓徐块,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灾而。 傳聞我的和親對象是個殘疾皇子胡控,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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