崩潰bug日志總結(jié)3

目錄介紹

  • 1.1 OnErrorNotImplementedException【 Can't create handler inside thread that has not called Looper.prepare()】
  • 1.2 adb.exe,start-server' failed -- run manually if necessary
  • 1.3 java.lang.IllegalStateException: ExpectedBEGIN_OBJECT but was STRING at line 1 column 1 path $
  • 1.4 android.content.ActivityNotFoundException: No Activity found to handle Intent
  • 1.5 Package manager has died導致崩潰
  • 1.6 IllegalArgumentException View添加窗口錯誤
  • 1.7 IllegalStateException: Not allowed to start service Intent異常崩潰
  • 1.8 java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState
  • 1.9 在Fragment中通過getActivity找不到上下文纸淮,報null導致空指針異常

好消息

  • 博客筆記大匯總【16年3月到至今】鄙漏,包括Java基礎(chǔ)及深入知識點翻擒,Android技術(shù)博客晚缩,Python學習筆記等等,還包括平時開發(fā)中遇到的bug匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續(xù)完善……開源的文件是markdown格式的捺疼!同時也開源了生活博客,從12年起永罚,積累共計47篇[近20萬字]啤呼,轉(zhuǎn)載請注明出處,謝謝呢袱!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好官扣,可以star一下,謝謝羞福!當然也歡迎提出建議惕蹄,萬事起于忽微,量變引起質(zhì)變治专!

1.1 OnErrorNotImplementedException【 Can't create handler inside thread that has not called Looper.prepare()】

  • A.詳細崩潰日志信息
    Can't create handler inside thread that has not called Looper.prepare()
    
  • B.查看崩潰類信息
  • C.項目中異常分析
  • D.引發(fā)崩潰日志的流程分析
    • 這是因為Handler對象與其調(diào)用者在同一線程中卖陵,如果在Handler中設(shè)置了延時操作,則調(diào)用線程也會堵塞张峰。每個Handler對象都會綁定一個Looper對象泪蔫,每個Looper對象對應(yīng)一個消息隊列(MessageQueue)。如果在創(chuàng)建Handler時不指定與其綁定的Looper對象喘批,系統(tǒng)默認會將當前線程的Looper綁定到該Handler上撩荣。
    • 在主線程中铣揉,可以直接使用new Handler()創(chuàng)建Handler對象,其將自動與主線程的Looper對象綁定婿滓;在非主線程中直接這樣創(chuàng)建Handler則會報錯老速,因為Android系統(tǒng)默認情況下非主線程中沒有開啟Looper,而Handler對象必須綁定Looper對象凸主。
    • 如果在主線程中創(chuàng)建handler時,系統(tǒng)會自動創(chuàng)建Looper,但是在子線程中創(chuàng)建handler時额湘,是不會自動創(chuàng)建Looper的卿吐,此時如果不手動創(chuàng)建Looper,系統(tǒng)就會崩潰
  • F.解決辦法
    • 不要在子線程中做UI操作锋华,比如更改界面嗡官,吐司等等……
    • 方法1:需先在該線程中手動開啟Looper(Looper.prepare()-->Looper.loop()),然后將其綁定到Handler對象上毯焕;
    final Runnable runnable = new Runnable() {
      @Override
      public void run() {
        //執(zhí)行耗時操作
        try {
    
          Log.e("bm", "runnable線程: " + Thread.currentThread().getId()+ " name:" + Thread.currentThread().getName());
    
          Thread.sleep(2000);
          Log.e("bm", "執(zhí)行完耗時操作了~");
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
      }
    };
    new Thread() {
      public void run() {
        Looper.prepare();
        new Handler().post(runnable);//在子線程中直接去new 一個handler
        Looper.loop();    //這種情況下衍腥,Runnable對象是運行在子線程中的,可以進行聯(lián)網(wǎng)操作纳猫,但是不能更新UI
      }
    }.start();
    
    • 方法2:通過Looper.getMainLooper()婆咸,獲得主線程的Looper,將其綁定到此Handler對象上芜辕。
    final Runnable runnable = new Runnable() {
      @Override
      public void run() {
        //執(zhí)行耗時操作
        try {
          Log.e("bm", "runnable線程: " + Thread.currentThread().getId()+ " name:" + Thread.currentThread().getName());
          Thread.sleep(2000);
          Log.e("bm", "執(zhí)行完耗時操作了~");
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
      }
    };
    new Thread() {
      public void run() {
          //在子線程中直接去new 一個handler
        new Handler(Looper.getMainLooper()).post(runnable);
        //這種情況下尚骄,Runnable對象是運行在主線程中的,不可以進行聯(lián)網(wǎng)操作侵续,但是可以更新UI
      }
    }.start();
    
  • G.其他延申

1.2 platform-tools\adb.exe,start-server' failed -- run manually if necessary

  • A.詳細崩潰日志信息
  • B.查看崩潰類信息
  • C.項目中異常分析
    • adb啟動失敗倔丈,端口被占用
  • D.引發(fā)崩潰日志的流程分析
  • F.解決辦法
    百度google大家多說的是任務(wù)管理器 kill掉adb 或者重啟adb server,但我任務(wù)管理器就沒有adb ,猜測是某個程序占用了adb端口状蜗。于是按此思路查找需五。
    5037為adb默認端口 查看該端口情況如下:
    netstat -aon|findstr "5037"
    TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
    發(fā)現(xiàn)6540占用了 5037端口,繼續(xù)查看6540的task轧坎,發(fā)現(xiàn)是wandoujia .如下所示
    tasklist|findstr "6540"
    wandoujia_daemon.exe 6540 Console 1 4,276 K
    
    接下來問題就好解決了宏邮,在任務(wù)管理器kill掉wandoujia_daemon.exe ,運行android程序眶根,ok .
    
    1.關(guān)閉xx莢進程
    2.adb kill-server
    3.adb start-server
    
  • G.其他延申

1.3 java.lang.IllegalStateException: ExpectedBEGIN_OBJECT but was STRING at line 1 column 1 path $

  • A.詳細崩潰日志信息
    • 非法參數(shù)蜀铲,開始讀取時應(yīng)該是{}括號,所以需要處理String字符串属百,它有可能不是標準的json數(shù)據(jù)
    java.lang.IllegalStateException: ExpectedBEGIN_OBJECT but was STRING at line 1 column 1 path $
    
  • B.查看崩潰類信息
  • C.項目中異常分析
    • Gson解析數(shù)據(jù)出現(xiàn)問題记劝,原因服務(wù)器返回數(shù)據(jù)不嚴謹
  • D.引發(fā)崩潰日志的流程分析
    • 可能的錯誤:
      • bean類字段類型和字段名稱不一致。
      • 服務(wù)器訪問得到的字符串不是純json前面有空格和回車等字符(難發(fā)現(xiàn))族扰。
      • 如果訪問的json字符串不是utf-8編碼時厌丑,用Gson解析會出這種問題定欧,在日志中打印會發(fā)現(xiàn)json的{}前面有亂碼字符,也需要注意一下怒竿。這是因為不同的編碼的原因?qū)е碌目仇虼吮仨氃L問utf-8的json字符串,才會減少這種問題耕驰。
    • 問題可能是:字符串并不是純json字符串爷辱,開頭可能會帶有空字符或者回車符,這屬于服務(wù)器問題朦肘,但我們也可以解決饭弓。
    • 最重要原因的我們網(wǎng)絡(luò)請求后結(jié)果是字符串,而不是json媒抠,因此需要處理弟断。
  • F.解決辦法
    /**
    * 判斷是否是json結(jié)構(gòu)。這種判斷不是很嚴謹
    */
    public static boolean isJson(String value) {
        try {
            new JSONObject(value);
        } catch (JSONException e) {
            return false;
        }
        return true;
    }
    
    /**
    * 判斷是否是json結(jié)構(gòu)
    */
    public static boolean isGoodJson(String json) {
        try {
            new JsonParser().parse(json);
            return true;
        } catch (JsonParseException e) {
            System.out.println("bad json: " + json);
            return false;
        }
    }
    
  • G.其他延申趴生,補充說明
    • 解決辦法:后臺輸出穩(wěn)定的Gson格式阀趴。此方法工程量太大
    • 真正的問題是我的數(shù)據(jù)結(jié)構(gòu)有問題
    • 例如下面Json字符串:
    • {"code":1,"info":"success","results":{"id":"1","name":"hehe"}}
    • results對應(yīng)的應(yīng)該是一個實體類,如果這個時候想把他解析為String或者List就會出現(xiàn)異常
    • 如果參考使用GsonForm處理后的數(shù)據(jù)模型苍匆,幾乎不會出現(xiàn)問題刘急;加入result后面的內(nèi)容可能在請求時會因為某些原因會存在格式上的變化,這個時候就有出現(xiàn)該異常的風險锉桑。Gson中排霉,關(guān)鍵字后面出現(xiàn)""引起來的內(nèi)容將會被只認為是STRING,“{}”只被認為是類民轴,“[]”只被認為是List攻柠,這個幾乎是強制性的。
    • 就是說如果你的實體預(yù)計是獲取String的變量后裸,但是關(guān)鍵字后面對應(yīng)的卻出現(xiàn)了“{”或“[”瑰钮,那么這個轉(zhuǎn)換將被認為是錯誤的,拋出異常微驶。

1.4 android.content.ActivityNotFoundException: No Activity found to handle Intent

  • A.詳細崩潰日志信息
    android.content.ActivityNotFoundException: No Activity found to handle Intent
    
  • B.查看崩潰類信息
    • 當調(diào)用{@link Context#startActivity}或其變體之一失敗時浪谴,會引發(fā)此異常,因為無法找到執(zhí)行給定意圖的活動因苹。
    public class ActivityNotFoundException extends RuntimeException
    {
        public ActivityNotFoundException()
        {
        }
    
        public ActivityNotFoundException(String name)
        {
            super(name);
        }
    };
    
  • C.項目中異常分析
  • D.引發(fā)崩潰日志的流程分析
  • F.解決辦法
    • 第一種辦法:做一個try catch
    Intent intent = new Intent(Intent.ACTION_SENDTO,url);
    try {
        context.startActivity(intent);
    } catch(ActivityNotFoundException exception) {
        Toast.makeText(this, "no activity", Toast.LENGTH_SHORT).show();
    }
    
    • 第二種辦法:判斷是否有應(yīng)用寶客戶端
    //避免安裝了應(yīng)用寶的用戶點擊其他外部鏈接走此方法導致崩潰
    //判斷是否用應(yīng)用寶客戶端
    if(AppUtils.isPkgInstalled(AdDetailActivity.this,"com.tencent.android.qqdownloader")){
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity( intent);
    }
    

1.5 Package manager has died導致崩潰

  • A.詳細崩潰日志信息
    出錯代碼位置
    public static String softVersionName(Context context) {
        PackageInfo info = null;
        try {
            info = context.getPackageManager().getPackageInfo( context.getPackageName(), 0);     //在這里
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return info.versionName;
    }
    
  • B.查看崩潰類信息
  • C.項目中異常分析
  • D.引發(fā)崩潰日志的流程分析
    • 原因分析(Binder造成)
    • 如果一個進程中使用的Binder內(nèi)容超過了1M苟耻,就會crash.
    • 如果Binder的使用超出了一個進程的限制就會拋出TransactionTooLargeException這個異常。
    • 如果是其他原因造成Binder crash的話就會拋出RuntimeException扶檐。
  • F.解決辦法
    public static String softVersionName(Context context) {
        PackageInfo info = null;
        try {//增加同步塊
            synchronized (context) {
                info =context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            }
            return info.versionName;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    
  • G.其他延申
    private void test() {
            //這個Demo就是同時創(chuàng)建兩個線程來進行Binder調(diào)用.
            for (int i = 0; i < 2; i++) {
                new Thread() {
                    @Override
                    public void run() {
                        int count = 0;
                        List<PackageInfo> list = getPackageManager().getInstalledPackages(0);
                        for (PackageInfo info : list) {
                            if(count >=1000){
                                break;
                            }
                            try {
                                PackageInfo pi = getPackageManager().getPackageInfo(info.packageName, PackageManager.GET_ACTIVITIES);
                            } catch (PackageManager.NameNotFoundException e) {
    
                            }
                        }
                    }
                }.start();
            }
        }
    }
    
    • 錯誤打印日志
    • image
    • 解決方式:其實只要避免多個線程同時來調(diào)用Binder就可以了凶杖,畢竟一個線程用了會釋放,所以理論上是很難發(fā)生的款筑。
    synchronized(MainActivity.class){ 
        PackageInfo pi = getPackageManager() .getPackageInfo(info.packageName, PackageManager.GET_ACTIVITIES); 
    } 
    

1.6 IllegalArgumentException View添加窗口錯誤

  • A.詳細崩潰日志信息
    View=com.android.internal.policy.impl.PhoneWindow$DecorView{22a4fb16 V.E..... R.....ID 0,0-1080,1020} not attached to window manager
    com.flyco.dialog.widget.base.BaseDialog.superDismiss(BaseDialog.java)
    
  • B.查看崩潰類信息
  • C.項目中異常分析
    • 該異常表示view沒有添加到窗口管理器智蝠,通常是我們dismiss對話框的時候腾么,activity已經(jīng)不存在了,建議不要在非UI線程操作對話框杈湾。
  • D.引發(fā)崩潰日志的流程分析
    • 常發(fā)生這類Exception的情形都是解虱,有一個費時的線程操作,需要顯示一個Dialog漆撞,在任務(wù)開始的時候顯示一個對話框殴泰,然后當任務(wù)完成了在Dismiss對話框,如果在此期間如果Activity因為某種原因被殺掉且又重新啟動了叫挟,那么當dialog調(diào)用dismiss的時候WindowManager檢查發(fā)現(xiàn)Dialog所屬的Activity已經(jīng)不存在艰匙,所以會報錯。要避免此類Exception抹恳,就要正確的使用對話框,也要正確的使用線程
  • F.解決辦法
    • 可以參考崩潰bug日志總結(jié)1中的1.7
  • G.其他延申署驻,建議
    • 不要在非UI線程中使用對話框創(chuàng)建奋献,顯示和取消對話框;
    • 盡量少用單獨線程旺上,出發(fā)是真正的耗時操作采用線程瓶蚂,線程也不要直接用Java式的匿名線程,除非是那種單純的操作宣吱,操作完成不需要做其他事情的窃这。
    • 如果是在fragment中發(fā)起異步網(wǎng)絡(luò)的回調(diào)中進行dialog的操作,那么在操作之前征候,需要判斷 isAdd( )杭攻,避免fragment被回收了但是還要求dialog去dismiss
    • 在Activity onDestroy中對Dialog提前進行關(guān)閉

1.7 IllegalStateException: Not allowed to start service Intent異常崩潰

  • A.詳細崩潰日志信息
     Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { act=initApplication cmp=com.paidian.hwmc/.service.InitializeService }: app is in background uid UidRecord{a37d28d u0a386 TRNB bg:+5m30s482ms idle procs:3 seq(0,0,0)}
    
  • B.查看崩潰類信息
  • C.項目中異常分析
  • D.引發(fā)崩潰日志的流程分析
  • F.解決辦法
  • G.其他延申

1.8 java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState

  • A.詳細崩潰日志信息

    • image
  • B.查看崩潰類信息
  • C.項目中異常分析
    • 通過下面的源碼分析,我們可以知道疤坝,出現(xiàn)以上崩潰日志的原因兆解,是因為我們在按下頁面返回鍵的時候,當前Activity以及在執(zhí)行銷毀操作(也就是說我們以前在其他地方調(diào)用了finish方法)跑揉。
  • D.引發(fā)崩潰日志的流程分析
    • 問題所在是Activity#onBackPressed()方法锅睛。查看源代碼:點擊onBackPressed方法中的super
    • 在FragmentActivity中
    @Override
    public void onBackPressed() {
        if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) {
            super.onBackPressed();
        }
    }
    
    • 接著再次點擊super,在Activity中
    public void onBackPressed() {
        if (mActionBar != null && mActionBar.collapseActionView()) {
            return;
        }
    
        if (!mFragments.getFragmentManager().popBackStackImmediate()) {
            finishAfterTransition();
        }
    }
    public void finishAfterTransition() {
        if (!mActivityTransitionState.startExitBackTransition(this)) {
            finish();
        }
    }
    
    • 我們看到onBackPressed()方法執(zhí)行了兩個操作历谍,第一個是獲取當前的FragmentManager现拒,并且執(zhí)行退棧操作,第二個是在退棧完成之后望侈,執(zhí)行finish方法印蔬。繼續(xù)查看源碼,關(guān)鍵是FragmentManager實現(xiàn)類的popBackStackImmediate方法
    @Override
    public boolean popBackStackImmediate() {
        checkStateLoss();
        executePendingTransactions();
        return popBackStackState(mHost.getHandler(), null, -1, 0);
    }
    
    • 我們看到甜无,在執(zhí)行退棧動作之前扛点,這里還有一步檢查操作
    private void checkStateLoss() {
        if (mStateSaved) {
            throw new IllegalStateException(
                    "Can not perform this action after onSaveInstanceState");
        }
        if (mNoTransactionsBecause != null) {
            throw new IllegalStateException(
                    "Can not perform this action inside of " + mNoTransactionsBecause);
        }
    }
    
    • 從這里哥遮,我們終于找到了崩潰日志上的異常文案:Can not perform this action after onSaveInstanceState
  • F.解決辦法
    • 方案1,在調(diào)用super.onBackPressed的時候陵究,我們需要判斷當前Activity是否正在執(zhí)行銷毀操作眠饮。
    if (!isFinishing()) {
        super.onBackPressed();
    }
    
    • 方案2,通過上面的源碼分析铜邮,我們也知道了仪召,super.onBackPressed最后也是調(diào)用finish()方法,因此我們可以重寫onBackPressed松蒜,直接調(diào)用finish方法扔茅。
  • G.其他延申

1.9 在Fragment中通過getActivity找不到上下文,報null導致空指針異常

  • A.詳細崩潰日志信息
  • B.查看崩潰類信息
  • C.項目中異常分析
    • 使用ViewPager+Fragment進行視圖滑動秸苗,在某些部分邏輯也許我們需要利用上下文Context(例如基本的Toast)召娜,但是由于Fragment只是衣服在Activity容器的一個試圖,如果需要拿到當前的Activity的上下文Context就必須通過getActivity()獲取惊楼。
    • 遇過出現(xiàn)getActivity()出現(xiàn)null的時候?qū)е鲁绦驁蟪隹罩羔槷惓>寥场F鋵嵲蚩梢詺w結(jié)于因為我們在
      • 切換fragment的時候,會頻繁被crash
      • 系統(tǒng)內(nèi)存不足
      • 橫豎屏幕切換的時候
      • 以上情況都會導致Activity被系統(tǒng)回收檀咙,但是由于fragment的生命周期不會隨著Actiivty被回收而被回收雅倒,因此才會導致getActivity()出現(xiàn)null的問題。
    • 很多人都曾被這個問題所困擾弧可,如果app長時間在后臺運行蔑匣,再次進入app的時候可能會出現(xiàn)crash,而且fragment會有重疊現(xiàn)象棕诵。如果系統(tǒng)內(nèi)存不足裁良、切換橫豎屏、app長時間在后臺運行年鸳,Activity都可能會被系統(tǒng)回收然后重建趴久,但Fragment并不會隨著Activity的回收而被回收,創(chuàng)建的所有Fragment會被保存到Bundle里面搔确,從而導致Fragment丟失對應(yīng)的Activity彼棍。
  • D.引發(fā)崩潰日志的流程分析
    • 當遇到getActivity()為null,或getContext()時膳算,先冷靜想想以下3點:
      • 1.是不是放在了第三方的回調(diào)中
      • 2.是不是在其他進程中調(diào)用了(其實第一點就是在其他進程中調(diào)用了)
      • 3.是不是調(diào)用時不在指定生命周期范圍內(nèi)(onAttach與onDetach之間)
  • F.解決辦法
    在Fragment中直接調(diào)用
    private MActivity mActivity; 
    @Override 
    public void onAttach(Activity activity) { 
        super.onAttach(activity); 
        mActivity = (MActivity) activity; 
    }
    @Override
    public void onDetach() {
        super.onDetach();
        mActivity = null;
    }
    
  • G.其他延申
    • 源碼解讀:在FragmentActivity中
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);
        }
        ……
    }
    
    • 如果從最近使用的應(yīng)用里面點擊我們的應(yīng)用座硕,系統(tǒng)會恢復之前被回收的Activity,這個時候FragmentActivity在oncreate里面也會做Fragment的恢復
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        mFragments.attachHost(null /*parent*/);
        super.onCreate(savedInstanceState);
        NonConfigurationInstances nc = (NonConfigurationInstances) getLastNonConfigurationInstance();
        if (nc != null) {
            mFragments.restoreLoaderNonConfig(nc.loaders);
        }
        if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
      ……
        }
        if (mPendingFragmentActivityResults == null) {
            mPendingFragmentActivityResults = new SparseArrayCompat<>();
            mNextCandidateRequestIndex = 0;
        }
        mFragments.dispatchCreate();
    }
    
    • 假設(shè)我們的頁面叫MyActivity(繼承自FragmentActivity)涕蜂,其中用到的Fragment叫MyFragment华匾。出現(xiàn)上面這種情況時,app發(fā)生的變化如下:
      • 1机隙、在前面提到的幾種情況下系統(tǒng)回收了MyActivity
      • 2蜘拉、通過onSaveInstanceState保存MyFragment的狀態(tài)
      • 3萨西、用戶再次點擊進入app
      • 4、由于MyActivity被回收旭旭,系統(tǒng)會重啟MyActivity谎脯,根據(jù)之前保存的MyFragment的狀態(tài)恢復fragment
      • 5、MyActivity的代碼邏輯中持寄,會再次創(chuàng)建新的MyFragment
      • 6源梭、頁面出現(xiàn)混亂,覆蓋了兩層的fragment稍味。假如恢復的MyFragment使用到了getActivity()方法废麻,會報空指針異常
    • 對于上面的問題,可以考慮下面這兩種解決辦法:
      • 1模庐、不保存fragment的狀態(tài):在MyActivity中重寫onSaveInstanceState方法烛愧,將super.onSaveInstanceState(outState);注釋掉,讓其不再保存Fragment的狀態(tài)掂碱,達到fragment隨MyActivity一起銷毀的目的屑彻。
      • 2、重建時清除已經(jīng)保存的fragment的狀態(tài):在恢復Fragment之前把Bundle里面的fragment狀態(tài)數(shù)據(jù)給清除顶吮。方法如下:
    if(savedInstanceState!= null){
        String FRAGMENTS_TAG =  "Android:support:fragments";
        savedInstanceState.remove(FRAGMENTS_TAG);
    }
    

關(guān)于其他內(nèi)容介紹

01.關(guān)于博客匯總鏈接

02.關(guān)于我的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粪薛,一起剝皮案震驚了整個濱河市悴了,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌违寿,老刑警劉巖湃交,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藤巢,居然都是意外死亡搞莺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門掂咒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來才沧,“玉大人,你說我怎么就攤上這事绍刮∥略玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵孩革,是天一觀的道長岁歉。 經(jīng)常有香客問我,道長膝蜈,這世上最難降的妖魔是什么锅移? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任熔掺,我火速辦了婚禮,結(jié)果婚禮上非剃,老公的妹妹穿的比我還像新娘置逻。我一直安慰自己,他們只是感情好努潘,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布诽偷。 她就那樣靜靜地躺著,像睡著了一般疯坤。 火紅的嫁衣襯著肌膚如雪报慕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天压怠,我揣著相機與錄音眠冈,去河邊找鬼。 笑死菌瘫,一個胖子當著我的面吹牛蜗顽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雨让,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼雇盖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栖忠?” 一聲冷哼從身側(cè)響起崔挖,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庵寞,沒想到半個月后狸相,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡捐川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年脓鹃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片古沥。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘸右,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渐白,到底是詐尸還是另有隱情尊浓,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布纯衍,位于F島的核電站栋齿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓦堵,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一基协、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菇用,春花似錦澜驮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卦绣,卻和暖如春耐量,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滤港。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工廊蜒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溅漾。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓山叮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親添履。 傳聞我的和親對象是個殘疾皇子屁倔,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評論 25 707
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料暮胧? 從這篇文章中你...
    hw1212閱讀 12,712評論 2 59
  • 【Android Handler 消息機制】 前言 在Android開發(fā)中汰现,我們都知道不能在主線程中執(zhí)行耗時的任務(wù)...
    Rtia閱讀 4,834評論 1 28
  • Python+Flask搭建mock api server 前言: 近期由于工作需要,需要一個Mock Serve...
    骨頭骨頭懶骨頭閱讀 5,866評論 1 14
  • 首先叔壤。你不能比我過得好。 其次口叙。你得到的我都必須有炼绘。 再次。你不能比他還開心妄田。
    生煎狍子閱讀 463評論 0 0