Lifecycle原理分析

Android_Banner.jpg

簡(jiǎn)介

  • 上一遍文章中介紹了如何使用Lifecycle來(lái)感知Acitivity的生命周期的鲜屏。
  • 讓我們來(lái)簡(jiǎn)單的回顧一下
    • 首先新建一個(gè)MyObsever 繼承至 LifecycleObsever(如果是使用Java8 可以使用DefaultLifecycleObserver,可以不用寫(xiě)注解,直接重寫(xiě)對(duì)應(yīng)的方法就可以了)
    • 在Activity(androidx下的 ComponentActivity)中通過(guò) getLifecycle().addObserver(MyObserver()) 這行代碼,將我們的觀察者添加到Lifecycle中(確切說(shuō)是LifcycleRegister中)
    • 通過(guò)如上的操作就能感知到Activity的生命周期了
  • 其實(shí)對(duì)于我們程序員來(lái)說(shuō)浦箱,日常最多的就是使用框架虹曙,使用API滑凉,來(lái)完成需求,針對(duì)我們項(xiàng)目中使用的開(kāi)源或者官方提供封裝好的框架贫橙,我們很有必要去了解一下它的原理贪婉,起碼在和別人吹牛的時(shí)候,可以有東西吹啊卢肃,覺(jué)得你這個(gè)人不禁需求完成的不錯(cuò)疲迂,而且還有一顆強(qiáng)烈學(xué)習(xí)的心
  • 針對(duì)Lifecycle的原理,我們可以從這行代碼入手 getLifecycle().addObserver(MyObserver())莫湘,可以分解成如下
    • getLifecycle() ---> 獲取到Lifecycle類(lèi)型的對(duì)象
    • 將我們自定義好的觀察者添加進(jìn)去 addObserver()
Lifecycle解決什么問(wèn)題尤蒿?
  • 生命周期的統(tǒng)一管理,“一處修改幅垮,處處生效的作用”
  • 讓第三方組件可以在自己內(nèi)部隨時(shí)拿到生命周期的狀態(tài)腰池,以便自己能夠隨時(shí)可以開(kāi)啟或者暫停
  • 讓第三方組件在調(diào)試時(shí) 能夠 更方便和安全地追蹤到 事故所在的生命周期源。

原理分析

getLifecycle()
  • 點(diǎn)開(kāi)我們的getLifecycle()方法我們可以看到忙芒,我們來(lái)到了ComponentActivity中

     @NonNull
        @Override
        public Lifecycle getLifecycle() {
            return mLifecycleRegistry;
        }
    
    • 該方法返回的是一個(gè)LifyCycleRegistry對(duì)象
    • LifecycleRegister是繼承至Lifecycle的
  • 看下我們這個(gè)ComponentActivity(挑重要有關(guān)的說(shuō)了)

  public class ComponentActivity extends androidx.core.app.ComponentActivity implements
       LifecycleOwner,
       ViewModelStoreOwner,
       SavedStateRegistryOwner,
       OnBackPressedDispatcherOwner {

public interface LifecycleOwner {
   /**
    * Returns the Lifecycle of the provider.
    *
    * @return The lifecycle of the provider.
    */
   @NonNull
   Lifecycle getLifecycle();
}

  • 它繼承至androidx.core.app.ComponentActivity
  • 并且實(shí)現(xiàn)了LifecycleOwner(生命周期擁有者)
    • 其實(shí)我們的getLifecycle()方法就是實(shí)現(xiàn)LifcycycleOwner接口內(nèi)的方法
addObserver()方法

調(diào)用的addObserver()是屬于LifyCycleRegistry中的示弓,我們先來(lái)看下LifyCycleRegistry這個(gè)類(lèi)

  • 生命周期登記,它是Lifecycle的子類(lèi)呵萨,起到添加觀察者奏属、響應(yīng)生命周期事件、分發(fā)生命周期事件的作用

  • 部分核心源碼

    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
                new FastSafeIterableMap<>();
      
    private State mState;
       
    private final WeakReference<LifecycleOwner> mLifecycleOwner;
    
    // 順便看下 Lifecycle的源碼
    public abstract class Lifecycle {
    
       
       
        @MainThread
        public abstract void addObserver(@NonNull LifecycleObserver observer);
    
      
        @MainThread
        public abstract void removeObserver(@NonNull LifecycleObserver observer);
    
        @MainThread
        @NonNull
        public abstract State getCurrentState();
    
        @SuppressWarnings("WeakerAccess")
        public enum Event {
         
            ON_CREATE,
           
            ON_START,
           
            ON_RESUME,
           
            ON_PAUSE,
           
            ON_STOP,
         
            ON_DESTROY,
          
            ON_ANY
        }
    
      
        @SuppressWarnings("WeakerAccess")
        public enum State {
      
            DESTROYED,
    
            INITIALIZED,
    
           
            CREATED,
    
            STARTED,
    
           
            RESUMED;
    
            public boolean isAtLeast(@NonNull State state) {
                return compareTo(state) >= 0;
            }
        }
    }
    
    • FastSafeIterableMap是一個(gè)Map甘桑,用來(lái)保存觀察者和它對(duì)應(yīng)的狀態(tài)
    • mState對(duì)應(yīng)著當(dāng)前的狀態(tài)(Lifecycle)
    • LicecycleOwner表示生命周期的擁有者拍皮,我們的ComponentActivity實(shí)現(xiàn)了該接口
    • 可以看到Lifecycle中有兩個(gè)枚舉類(lèi),分別是事件和狀態(tài)跑杭,還有添加和移除觀察者的方法和趕會(huì)當(dāng)前Lifecycle對(duì)應(yīng)的狀態(tài)
  • LifyCycleRegistry # addObserver()

    @Override
        public void 
          (@NonNull LifecycleObserver observer) {
              //當(dāng)前的狀態(tài)是DESTROY的話铆帽,添加的Observer的初始狀態(tài)就是DESTROY否則就是INITIALIZED
            State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
            //創(chuàng)建一個(gè)ObserverWithState,它是LifecycleRegister類(lèi)中的一個(gè)靜態(tài)內(nèi)部類(lèi)德谅,將添加的Observer與狀態(tài)關(guān)聯(lián)到一起爹橱,(說(shuō)白就是用它來(lái)維持Observer與State的對(duì)應(yīng)關(guān)系)
            ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
            // 以observer作為key,ObserverWithState作為value存儲(chǔ)到Map中
              //如果當(dāng)前Observer對(duì)應(yīng)的value不存在窄做,就將observer與對(duì)應(yīng)的value存儲(chǔ)到map
              //否則的話就將Observer對(duì)應(yīng)的value獲取到并且返回當(dāng)前的value
          ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
    
            if (previous != null) {
                return;
            }
            LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
            if (lifecycleOwner == null) {
                // it is null we should be destroyed. Fallback quickly
                return;
            }
    
            boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
            State targetState = calculateTargetState(observer);
            mAddingObserverCounter++;
              //注釋1
            while ((statefulObserver.mState.compareTo(targetState) < 0
                    && mObserverMap.contains(observer))) {
                pushParentState(statefulObserver.mState);
                statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
                popParentState();
                // mState / subling may have been changed recalculate
                targetState = calculateTargetState(observer);
            }
    
            if (!isReentrance) {
                // we do sync only on the top level.
                sync();
            }
            mAddingObserverCounter--;
        }
    
    • 該方法是添加LifecycleObserver觀察者愧驱,并且可以將之前生命狀態(tài)分發(fā)給當(dāng)前添加的Observer的,例如我們?cè)贏ctivtity的onResume之后添加這個(gè)Observer椭盏,那么該Observer依然能收到ON_CREATE事件
    • 注釋一:如果Observable的初始狀態(tài)是INITIALIZED组砚,當(dāng)前的狀態(tài)是RESUMED,那么需要將INITIALIZED到RESUMED之間的所有事件都分發(fā)給Observer
    • 到這里我們回過(guò)頭來(lái)看下 ComponentActivity
  • ComponentActivity # onCreate()

     @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mSavedStateRegistryController.performRestore(savedInstanceState);
              //注釋1
            ReportFragment.injectIfNeededIn(this);
            if (mContentLayoutId != 0) {
                setContentView(mContentLayoutId);
            }
        }
    
    • 注釋1:我們調(diào)用了ReportFragment # injectIfNeededIn(this)
  • ReportFragment # injectIfNeededIn()

    public static void injectIfNeededIn(Activity activity) {
            // ProcessLifecycleOwner should always correctly work and some activities may not extend
            // FragmentActivity from support lib, so we use framework fragments for activities
            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();
            }
        }
    
    • 這里我們添加了一個(gè)Fragment到Activity中
    • 并且這個(gè)Fragment是一個(gè)沒(méi)有界面
    • 其實(shí)添加這個(gè)Fragment就是用來(lái)感知Activity的生命周期的
  • ReportFragment的生命周期方法

    @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            dispatchCreate(mProcessListener);
            dispatch(Lifecycle.Event.ON_CREATE);
        }
    
        @Override
        public void onStart() {
            super.onStart();
            dispatchStart(mProcessListener);
            dispatch(Lifecycle.Event.ON_START);
        }
    
        @Override
        public void onResume() {
            super.onResume();
            dispatchResume(mProcessListener);
            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);
            // just want to be sure that we won't leak reference to an activity
            mProcessListener = null;
        }
    
    
    • 通過(guò)觀察發(fā)現(xiàn)掏颊,都調(diào)用了dispatch()方法
  • ReportFragment # dispatch()方法

    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);
                }
            }
        }
    
    • 這里可以看出 有兩個(gè)Owner 分別是LifecycleOwner和LifecycleRegistryOwner區(qū)別是:
      • LifecycleOwner # getLifecycle() ----> Lifecycle
      • LifecycleRegistryOwner # getLifecycle() ---> LifecycleRegister()
      • 而我們的LifecycleRegistryOwner是繼承至LifecycleOwner的
    • 最終調(diào)用的都是 LifecycleRegistry #handleLifecycleEvent()的方法
  • LifecycleRegistry # handleLifecycleEvent()

     public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
            State next = getStateAfter(event);
            moveToState(next);
        }
          
          /**
          * 
          *根據(jù)事件返回我們當(dāng)前的狀態(tài)
          * 這個(gè)事件就是從ReportFragment中傳遞過(guò)來(lái)的
          */
       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);
        }
    
      /**
      * 改變狀態(tài)
      *
      */
      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;
        }
    
  • LifecycleRegistry # sync()

    private void sync() {
            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;
                // no need to check eldest for nullability, because isSynced does it for us.
                  //注釋1
                if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                    backwardPass(lifecycleOwner);
                }
                Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
               //注釋2
                if (!mNewEventOccurred && newest != null
                        && mState.compareTo(newest.getValue().mState) > 0) {
                    forwardPass(lifecycleOwner);
                }
            }
            mNewEventOccurred = false;
        }
    
    • 注釋1:如果當(dāng)前的狀態(tài)值小于 Observer狀態(tài)值糟红,需要將Observer的狀態(tài)值減小到和當(dāng)前狀態(tài)值相等。
    • 注釋2:如果當(dāng)前當(dāng)前的狀態(tài)值大于Observer的狀態(tài)值乌叶,需要將Observer的狀態(tài)值增大到和當(dāng)前狀態(tài)值相等盆偿。
  • LifecycleRegistry # backwardPass

    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));
                    observer.dispatchEvent(lifecycleOwner, event);
                    popParentState();
                }
            }
        }
    
    • 對(duì)應(yīng)著sync中注釋1的代碼
  • LifecycleRegistry # forwardPass

    private void forwardPass(LifecycleOwner lifecycleOwner) {
            Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                    mObserverMap.iteratorWithAdditions();
            while (ascendingIterator.hasNext() && !mNewEventOccurred) {
                Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
                ObserverWithState observer = entry.getValue();
                while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                        && mObserverMap.contains(entry.getKey()))) {
                    pushParentState(observer.mState);
                    observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                    popParentState();
                }
            }
        }
    
    • 對(duì)應(yīng)著sync注釋2的代碼
  • 在上述的兩段代碼中。(forwardPass和backwarPass)在調(diào)整State時(shí)准浴,都調(diào)用了 observer # dispatchEvent()

    • Observer ---> ObserverWithState
  • LifecycleRegistry # ObserverWithState # dispatchEvent()

     void dispatchEvent(LifecycleOwner owner, Event event) {
                State newState = getStateAfter(event);
                mState = min(mState, newState);
                mLifecycleObserver.onStateChanged(owner, event);
                mState = newState;
            }
    
    • 在此方法中我們調(diào)用了 LifecycleEventObserver的onStateChange方法
    • 那么這個(gè)LifecycleEventObserver時(shí)怎么來(lái)的呢事扭?
    • 在上文中 我們?cè)贚ifecycleRegistry # addObserver()方法中我們構(gòu)建了一個(gè)ObserverWithState(),我們看下ObserverWithState()的構(gòu)造方法
  • ObserverWithState()

    
    ObserverWithState(LifecycleObserver observer, State initialState) {
                mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
                mState = initialState;
     }
    
    • 可以看到我們的mLifecycleObserver對(duì)象時(shí)通過(guò) Lifecycling.lifecycleEventObserver(observer);獲取到的
  • Lifecycling # lifecycleEventObserver()

    @NonNull
        static LifecycleEventObserver lifecycleEventObserver(Object object) {
              // 我們傳入的object是我們自定義的MyObservable
              // 這里面 LifecycleEventObserver extends LifecycleObserver
              // FullLifecycleObserver extends LifecycleObserver
              // 對(duì)于instanceof關(guān)鍵字 左面是類(lèi)的引用,右面是一個(gè)接口或者一個(gè)類(lèi) 的類(lèi)型
              // 返回true的情況乐横,左邊的引用類(lèi)型是右邊類(lèi)型的求橄,或者是是其子類(lèi),或者是實(shí)現(xiàn)類(lèi)的類(lèi)型
              // 針對(duì)這里的情況晰奖,好像都不是
              // isLifecycleEventObserver ==  false
              // isFullLifecycleObserver == false
            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;
            }
    
            final Class<?> klass = object.getClass();
            int type = getObserverConstructorType(klass);
            if (type == GENERATED_CALLBACK) {
                List<Constructor<? extends GeneratedAdapter>> constructors =
                        sClassToAdapters.get(klass);
                if (constructors.size() == 1) {
                    GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                            constructors.get(0), object);
                    return new SingleGeneratedAdapterObserver(generatedAdapter);
                }
                GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
                for (int i = 0; i < constructors.size(); i++) {
                    adapters[i] = createGeneratedAdapter(constructors.get(i), object);
                }
                return new CompositeGeneratedAdaptersObserver(adapters);
            }
            return new ReflectiveGenericLifecycleObserver(object);
        }
    
    • 針對(duì)上述的分析谈撒,我們可以知道,lifecycleEventObserver()方法真正我們需要的是如下代碼
    final Class<?> klass = object.getClass();
                  // 獲取到的type=1
            int type = getObserverConstructorType(klass);
                  // GENERATED_CALLBACK == 2
            if (type == GENERATED_CALLBACK) {
                List<Constructor<? extends GeneratedAdapter>> constructors =
                        sClassToAdapters.get(klass);
                if (constructors.size() == 1) {
                    GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                            constructors.get(0), object);
                    return new SingleGeneratedAdapterObserver(generatedAdapter);
                }
                GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
                for (int i = 0; i < constructors.size(); i++) {
                    adapters[i] = createGeneratedAdapter(constructors.get(i), object);
                }
                return new CompositeGeneratedAdaptersObserver(adapters);
            }
            return new ReflectiveGenericLifecycleObserver(object);
    
    • 經(jīng)過(guò)上述分析匾南,可以看出返回的是 ReflectiveGenericLifecycleObserver()
  • ReflectiveGenericLifecycleObserver

    class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
        private final Object mWrapped;
        private final CallbackInfo mInfo;
    
        ReflectiveGenericLifecycleObserver(Object wrapped) {
            mWrapped = wrapped;
            mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
        }
    
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) {
            mInfo.invokeCallbacks(source, event, mWrapped);
        }
    }
    
     @SuppressWarnings("ConstantConditions")
            void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
                invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
                invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
                        target);
            }
    
            private static void invokeMethodsForEvent(List<MethodReference> handlers,
                    LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
                if (handlers != null) {
                    for (int i = handlers.size() - 1; i >= 0; i--) {
                        handlers.get(i).invokeCallback(source, event, mWrapped);
                    }
                }
            }
        }
    
     void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
                //noinspection TryWithIdenticalCatches
                try {
                    switch (mCallType) {
                        case CALL_TYPE_NO_ARG:
                            mMethod.invoke(target);
                            break;
                        case CALL_TYPE_PROVIDER:
                            mMethod.invoke(target, source);
                            break;
                        case CALL_TYPE_PROVIDER_WITH_EVENT:
                            mMethod.invoke(target, source, event);
                            break;
                    }
                } catch (InvocationTargetException e) {
                    throw new RuntimeException("Failed to call observer method", e.getCause());
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
    
    • 根據(jù)調(diào)用事件線走下去啃匿,調(diào)用了ReflectiveGenericLifecycleObserver的onStateChanged()
    • 繼而從invokeCallbacks() ---> invokeMethodsForEvent() ---> invokeCallback()
    • 當(dāng)生命周期發(fā)生改變的時(shí)候,最終通過(guò)反射(ReflectiveGenericLifecycleObserver存儲(chǔ)了我們?cè)?Observer 里注解的方法)調(diào)用了我們?cè)谟^察者中利用注解聲明的方法蛆楞。
總結(jié)
  • Lifecycle將Activity的生命周期函數(shù)對(duì)應(yīng)成Event溯乒,生命周期改變,會(huì)將Event傳遞給LifecycleRegistry豹爹,LifecycleRegistry中會(huì)修正State的值裆悄,并且觸發(fā)事件的分發(fā),通過(guò)反射通知到LifecycleObsever中接受事件的方法臂聋。
  • 基于觀察者模式光稼,將第三方組件以觀察者的形式在生命周期擁有者中通過(guò)addObserver()方法添加到List/Map中或南,當(dāng)生命周期的擁有者發(fā)生生命周期變化的時(shí)候,通過(guò)生命事件分發(fā)者(LifecycleRegister)遍歷集合中的觀察者艾君,執(zhí)行對(duì)應(yīng)的生命周期方法采够。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冰垄,隨后出現(xiàn)的幾起案子蹬癌,更是在濱河造成了極大的恐慌,老刑警劉巖虹茶,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逝薪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蝴罪,警方通過(guò)查閱死者的電腦和手機(jī)董济,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)要门,“玉大人感局,你說(shuō)我怎么就攤上這事≡莺猓” “怎么了询微?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狂巢。 經(jīng)常有香客問(wèn)我撑毛,道長(zhǎng),這世上最難降的妖魔是什么唧领? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任藻雌,我火速辦了婚禮,結(jié)果婚禮上斩个,老公的妹妹穿的比我還像新娘胯杭。我一直安慰自己,他們只是感情好受啥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布做个。 她就那樣靜靜地躺著,像睡著了一般滚局。 火紅的嫁衣襯著肌膚如雪居暖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天藤肢,我揣著相機(jī)與錄音太闺,去河邊找鬼。 笑死嘁圈,一個(gè)胖子當(dāng)著我的面吹牛省骂,可吹牛的內(nèi)容都是我干的蟀淮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钞澳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灭贷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起略贮,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仗岖,沒(méi)想到半個(gè)月后逃延,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧拄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年揽祥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檩电。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拄丰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俐末,到底是詐尸還是另有隱情料按,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布卓箫,位于F島的核電站载矿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烹卒。R本人自食惡果不足惜闷盔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旅急。 院中可真熱鬧逢勾,春花似錦、人聲如沸藐吮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谣辞。三九已至盟迟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潦闲,已是汗流浹背攒菠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歉闰,地道東北人辖众。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓卓起,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凹炸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戏阅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354