android常用工具類

Http相關輔助類HttpUtils

package com.zhy.utils;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtils
{
    private static final int TIMEOUT_IN_MILLIONS = 5000;
    public interface CallBack
        {
        void onRequestComplete(String result);
    }

    /**
     * 異步的Get請求
     * 
     * @param urlStr
     * @param callBack
     */
    public static void doGetAsyn(final String urlStr, final CallBack callBack)
    {
        new Thread()
        {
            public void run()
            {
                try
                {
                    String result = doGet(urlStr);
                    if (callBack != null)
                    {
                        callBack.onRequestComplete(result);
                    }
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            };
        }.start();
    }

    /**
     * 異步的Post請求
     * @param urlStr
     * @param params
     * @param callBack
     * @throws Exception
     */
    public static void doPostAsyn(final String urlStr, final String params,
            final CallBack callBack) throws Exception
    {
        new Thread()
        {
            public void run()
            {
                try
                {
                    String result = doPost(urlStr, params);
                    if (callBack != null)
                    {
                        callBack.onRequestComplete(result);
                    }
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            };
        }.start();
    }

    /**
     * Get請求,獲得返回數(shù)據
     * 
     * @param urlStr
     * @return
     * @throws Exception
     */
    public static String doGet(String urlStr) 
    {
        URL url = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try
        {
            url = new URL(urlStr);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            if (conn.getResponseCode() == 200)
            {
                is = conn.getInputStream();
                baos = new ByteArrayOutputStream();
                int len = -1;
                byte[] buf = new byte[128];

                while ((len = is.read(buf)) != -1)
                {
                    baos.write(buf, 0, len);
                }
                baos.flush();
                return baos.toString();
            } else
            {
                throw new RuntimeException(" responseCode is not 200 ... ");
            }

        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if (is != null)
                    is.close();
            } catch (IOException e)
            {
            }
            try
            {
                if (baos != null)
                    baos.close();
            } catch (IOException e)
            {
            }
            conn.disconnect();
        }
        
        return null ;

    }

    /**
     * 向指定 URL 發(fā)送POST方法的請求
     * 
     * @param url
     *            發(fā)送請求的 URL
     * @param param
     *            請求參數(shù),請求參數(shù)應該是 name1=value1&name2=value2 的形式。
     * @return 所代表遠程資源的響應結果
     * @throws Exception
     */
    public static String doPost(String url, String param) 
    {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try
        {
            URL realUrl = new URL(url);
            // 打開和URL之間的連接
            HttpURLConnection conn = (HttpURLConnection) realUrl
                    .openConnection();
            // 設置通用的請求屬性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            conn.setRequestProperty("charset", "utf-8");
            conn.setUseCaches(false);
            // 發(fā)送POST請求必須設置如下兩行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
            conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);

            if (param != null && !param.trim().equals(""))
            {
                // 獲取URLConnection對象對應的輸出流
                out = new PrintWriter(conn.getOutputStream());
                // 發(fā)送請求參數(shù)
                out.print(param);
                // flush輸出流的緩沖
                out.flush();
            }
            // 定義BufferedReader輸入流來讀取URL的響應
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null)
            {
                result += line;
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        // 使用finally塊來關閉輸出流、輸入流
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
                if (in != null)
                {
                    in.close();
                }
            } catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
        return result;
    }
}```
####網絡相關輔助類 NetUtils

package com.zhy.utils;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/**

  • 跟網絡相關的工具類

/
public class NetUtils
{
private NetUtils()
{
/
cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}

/**
 * 判斷網絡是否連接
 * 
 * @param context
 * @return
 */
public static boolean isConnected(Context context)
{

    ConnectivityManager connectivity = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    if (null != connectivity)
    {

        NetworkInfo info = connectivity.getActiveNetworkInfo();
        if (null != info && info.isConnected())
        {
            if (info.getState() == NetworkInfo.State.CONNECTED)
            {
                return true;
            }
        }
    }
    return false;
}

/**
 * 判斷是否是wifi連接
 */
public static boolean isWifi(Context context)
{
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm == null)
        return false;
    return cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;

}

/**
 * 打開網絡設置界面
 */
public static void openSetting(Activity activity)
{
    Intent intent = new Intent("/");
    ComponentName cm = new ComponentName("com.android.settings",
            "com.android.settings.WirelessSettings");
    intent.setComponent(cm);
    intent.setAction("android.intent.action.VIEW");
    activity.startActivityForResult(intent, 0);
}

}

####軟鍵盤相關輔助類KeyBoardUtils

package com.zhy.utils;

import android.content.Context;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**

  • 打開或關閉軟鍵盤
  • @author zhy

/
public class KeyBoardUtils
{
/
*
* 打卡軟鍵盤
*
* @param mEditText
* 輸入框
* @param mContext
* 上下文
*/
public static void openKeybord(EditText mEditText, Context mContext)
{
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
}

/**
 * 關閉軟鍵盤
 * 
 * @param mEditText
 *            輸入框
 * @param mContext
 *            上下文
 */
public static void closeKeybord(EditText mEditText, Context mContext)
{
    InputMethodManager imm = (InputMethodManager) mContext
            .getSystemService(Context.INPUT_METHOD_SERVICE);

    imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}

}

####App相關輔助類

package com.zhy.utils;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

/**

  • 跟App相關的輔助類

*/
public class AppUtils
{

private AppUtils()
{
    /* cannot be instantiated */
    throw new UnsupportedOperationException("cannot be instantiated");

}

/**
 * 獲取應用程序名稱
 */
public static String getAppName(Context context)
{
    try
    {
        PackageManager packageManager = context.getPackageManager();
        PackageInfo packageInfo = packageManager.getPackageInfo(
                context.getPackageName(), 0);
        int labelRes = packageInfo.applicationInfo.labelRes;
        return context.getResources().getString(labelRes);
    } catch (NameNotFoundException e)
    {
        e.printStackTrace();
    }
    return null;
}

/**
 * [獲取應用程序版本名稱信息]
 * 
 * @param context
 * @return 當前應用的版本名稱
 */
public static String getVersionName(Context context)
{
    try
    {
        PackageManager packageManager = context.getPackageManager();
        PackageInfo packageInfo = packageManager.getPackageInfo(
                context.getPackageName(), 0);
        return packageInfo.versionName;

    } catch (NameNotFoundException e)
    {
        e.printStackTrace();
    }
    return null;
}

}

####屏幕相關輔助類 ScreenUtils

package com.zhy.utils;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;

/**

  • 獲得屏幕相關的輔助類

/
public class ScreenUtils
{
private ScreenUtils()
{
/
cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}

/**
 * 獲得屏幕高度
 * 
 * @param context
 * @return
 */
public static int getScreenWidth(Context context)
{
    WindowManager wm = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics outMetrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(outMetrics);
    return outMetrics.widthPixels;
}

/**
 * 獲得屏幕寬度
 * 
 * @param context
 * @return
 */
public static int getScreenHeight(Context context)
{
    WindowManager wm = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics outMetrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(outMetrics);
    return outMetrics.heightPixels;
}

/**
 * 獲得狀態(tài)欄的高度
 * 
 * @param context
 * @return
 */
public static int getStatusHeight(Context context)
{

    int statusHeight = -1;
    try
    {
        Class<?> clazz = Class.forName("com.android.internal.R$dimen");
        Object object = clazz.newInstance();
        int height = Integer.parseInt(clazz.getField("status_bar_height")
                .get(object).toString());
        statusHeight = context.getResources().getDimensionPixelSize(height);
    } catch (Exception e)
    {
        e.printStackTrace();
    }
    return statusHeight;
}

/**
 * 獲取當前屏幕截圖,包含狀態(tài)欄
 * 
 * @param activity
 * @return
 */
public static Bitmap snapShotWithStatusBar(Activity activity)
{
    View view = activity.getWindow().getDecorView();
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap bmp = view.getDrawingCache();
    int width = getScreenWidth(activity);
    int height = getScreenHeight(activity);
    Bitmap bp = null;
    bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
    view.destroyDrawingCache();
    return bp;

}

/**
 * 獲取當前屏幕截圖,不包含狀態(tài)欄
 * 
 * @param activity
 * @return
 */
public static Bitmap snapShotWithoutStatusBar(Activity activity)
{
    View view = activity.getWindow().getDecorView();
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap bmp = view.getDrawingCache();
    Rect frame = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;

    int width = getScreenWidth(activity);
    int height = getScreenHeight(activity);
    Bitmap bp = null;
    bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height
            - statusBarHeight);
    view.destroyDrawingCache();
    return bp;

}

}

####SD卡相關輔助類 SDCardUtils

package com.zhy.utils;

import java.io.File;

import android.os.Environment;
import android.os.StatFs;

/**

  • SD卡相關的輔助類

/
public class SDCardUtils
{
private SDCardUtils()
{
/
cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}

/**
 * 判斷SDCard是否可用
 * 
 * @return
 */
public static boolean isSDCardEnable()
{
    return Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED);

}

/**
 * 獲取SD卡路徑
 * 
 * @return
 */
public static String getSDCardPath()
{
    return Environment.getExternalStorageDirectory().getAbsolutePath()
            + File.separator;
}

/**
 * 獲取SD卡的剩余容量 單位byte
 * 
 * @return
 */
public static long getSDCardAllSize()
{
    if (isSDCardEnable())
    {
        StatFs stat = new StatFs(getSDCardPath());
        // 獲取空閑的數(shù)據塊的數(shù)量
        long availableBlocks = (long) stat.getAvailableBlocks() - 4;
        // 獲取單個數(shù)據塊的大小(byte)
        long freeBlocks = stat.getAvailableBlocks();
        return freeBlocks * availableBlocks;
    }
    return 0;
}

/**
 * 獲取指定路徑所在空間的剩余可用容量字節(jié)數(shù),單位byte
 * 
 * @param filePath
 * @return 容量字節(jié) SDCard可用空間,內部存儲可用空間
 */
public static long getFreeBytes(String filePath)
{
    // 如果是sd卡的下的路徑,則獲取sd卡可用容量
    if (filePath.startsWith(getSDCardPath()))
    {
        filePath = getSDCardPath();
    } else
    {// 如果是內部存儲的路徑,則獲取內存存儲的可用容量
        filePath = Environment.getDataDirectory().getAbsolutePath();
    }
    StatFs stat = new StatFs(filePath);
    long availableBlocks = (long) stat.getAvailableBlocks() - 4;
    return stat.getBlockSize() * availableBlocks;
}

/**
 * 獲取系統(tǒng)存儲路徑
 * 
 * @return
 */
public static String getRootDirectoryPath()
{
    return Environment.getRootDirectory().getAbsolutePath();
}

}

####單位轉換類 DensityUtils

package com.zhy.utils;

import android.content.Context;
import android.util.TypedValue;

/**

  • 常用單位轉換的輔助類

/
public class DensityUtils
{
private DensityUtils()
{
/
cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}

/**
 * dp轉px
 * 
 * @param context
 * @param val
 * @return
 */
public static int dp2px(Context context, float dpVal)
{
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            dpVal, context.getResources().getDisplayMetrics());
}

/**
 * sp轉px
 * 
 * @param context
 * @param val
 * @return
 */
public static int sp2px(Context context, float spVal)
{
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
            spVal, context.getResources().getDisplayMetrics());
}

/**
 * px轉dp
 * 
 * @param context
 * @param pxVal
 * @return
 */
public static float px2dp(Context context, float pxVal)
{
    final float scale = context.getResources().getDisplayMetrics().density;
    return (pxVal / scale);
}

/**
 * px轉sp
 * 
 * @param fontScale
 * @param pxVal
 * @return
 */
public static float px2sp(Context context, float pxVal)
{
    return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
}

}

####SharedPreferences封裝類SPUtils

package com.zhy.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

import android.content.Context;
import android.content.SharedPreferences;

public class SPUtils
{
/**
* 保存在手機里面的文件名
*/
public static final String FILE_NAME = "share_data";

/**
 * 保存數(shù)據的方法,我們需要拿到保存數(shù)據的具體類型,然后根據類型調用不同的保存方法
 * 
 * @param context
 * @param key
 * @param object
 */
public static void put(Context context, String key, Object object)
{

    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    if (object instanceof String)
    {
        editor.putString(key, (String) object);
    } else if (object instanceof Integer)
    {
        editor.putInt(key, (Integer) object);
    } else if (object instanceof Boolean)
    {
        editor.putBoolean(key, (Boolean) object);
    } else if (object instanceof Float)
    {
        editor.putFloat(key, (Float) object);
    } else if (object instanceof Long)
    {
        editor.putLong(key, (Long) object);
    } else
    {
        editor.putString(key, object.toString());
    }

    SharedPreferencesCompat.apply(editor);
}

/**
 * 得到保存數(shù)據的方法,我們根據默認值得到保存的數(shù)據的具體類型,然后調用相對于的方法獲取值
 * 
 * @param context
 * @param key
 * @param defaultObject
 * @return
 */
public static Object get(Context context, String key, Object defaultObject)
{
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);

    if (defaultObject instanceof String)
    {
        return sp.getString(key, (String) defaultObject);
    } else if (defaultObject instanceof Integer)
    {
        return sp.getInt(key, (Integer) defaultObject);
    } else if (defaultObject instanceof Boolean)
    {
        return sp.getBoolean(key, (Boolean) defaultObject);
    } else if (defaultObject instanceof Float)
    {
        return sp.getFloat(key, (Float) defaultObject);
    } else if (defaultObject instanceof Long)
    {
        return sp.getLong(key, (Long) defaultObject);
    }

    return null;
}

/**
 * 移除某個key值已經對應的值
 * @param context
 * @param key
 */
public static void remove(Context context, String key)
{
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.remove(key);
    SharedPreferencesCompat.apply(editor);
}

/**
 * 清除所有數(shù)據
 * @param context
 */
public static void clear(Context context)
{
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.clear();
    SharedPreferencesCompat.apply(editor);
}

/**
 * 查詢某個key是否已經存在
 * @param context
 * @param key
 * @return
 */
public static boolean contains(Context context, String key)
{
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);
    return sp.contains(key);
}

/**
 * 返回所有的鍵值對
 * 
 * @param context
 * @return
 */
public static Map<String, ?> getAll(Context context)
{
    SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
            Context.MODE_PRIVATE);
    return sp.getAll();
}

/**
 * 創(chuàng)建一個解決SharedPreferencesCompat.apply方法的一個兼容類
 * 
 * @author zhy
 * 
 */
private static class SharedPreferencesCompat
{
    private static final Method sApplyMethod = findApplyMethod();

    /**
     * 反射查找apply的方法
     * 
     * @return
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static Method findApplyMethod()
    {
        try
        {
            Class clz = SharedPreferences.Editor.class;
            return clz.getMethod("apply");
        } catch (NoSuchMethodException e)
        {
        }

        return null;
    }

    /**
     * 如果找到則使用apply執(zhí)行,否則使用commit
     * 
     * @param editor
     */
    public static void apply(SharedPreferences.Editor editor)
    {
        try
        {
            if (sApplyMethod != null)
            {
                sApplyMethod.invoke(editor);
                return;
            }
        } catch (IllegalArgumentException e)
        {
        } catch (IllegalAccessException e)
        {
        } catch (InvocationTargetException e)
        {
        }
        editor.commit();
    }
}

}

>里面所有的commit操作使用了SharedPreferencesCompat.apply進行了替代,目的是盡可能的使用apply代替commit
首先說下為什么,因為commit方法是同步的,并且我們很多時候的commit操作都是UI線程中,畢竟是IO操作,盡可能異步;
所以我們使用apply進行替代,apply異步的進行寫入;
但是apply相當于commit來說是new API呢,為了更好的兼容,我們做了適配;

####Toast統(tǒng)一管理類 

package com.zhy.utils;

import android.content.Context;
import android.widget.Toast;

/**

  • Toast統(tǒng)一管理類

*/
public class T
{

private T()
{
    /* cannot be instantiated */
    throw new UnsupportedOperationException("cannot be instantiated");
}

public static boolean isShow = true;

/**
 * 短時間顯示Toast
 * 
 * @param context
 * @param message
 */
public static void showShort(Context context, CharSequence message)
{
    if (isShow)
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}

/**
 * 短時間顯示Toast
 * 
 * @param context
 * @param message
 */
public static void showShort(Context context, int message)
{
    if (isShow)
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}

/**
 * 長時間顯示Toast
 * 
 * @param context
 * @param message
 */
public static void showLong(Context context, CharSequence message)
{
    if (isShow)
        Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}

/**
 * 長時間顯示Toast
 * 
 * @param context
 * @param message
 */
public static void showLong(Context context, int message)
{
    if (isShow)
        Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}

/**
 * 自定義顯示Toast時間
 * 
 * @param context
 * @param message
 * @param duration
 */
public static void show(Context context, CharSequence message, int duration)
{
    if (isShow)
        Toast.makeText(context, message, duration).show();
}

/**
 * 自定義顯示Toast時間
 * 
 * @param context
 * @param message
 * @param duration
 */
public static void show(Context context, int message, int duration)
{
    if (isShow)
        Toast.makeText(context, message, duration).show();
}

}

####日志工具類L.java

package com.zhy.utils;

import android.util.Log;

/**

  • Log統(tǒng)一管理類

*/
public class L
{

private L()
{
    /* cannot be instantiated */
    throw new UnsupportedOperationException("cannot be instantiated");
}

public static boolean isDebug = true;// 是否需要打印bug,可以在application的onCreate函數(shù)里面初始化
private static final String TAG = "way";

// 下面四個是默認tag的函數(shù)
public static void i(String msg)
{
    if (isDebug)
        Log.i(TAG, msg);
}

public static void d(String msg)
{
    if (isDebug)
        Log.d(TAG, msg);
}

public static void e(String msg)
{
    if (isDebug)
        Log.e(TAG, msg);
}

public static void v(String msg)
{
    if (isDebug)
        Log.v(TAG, msg);
}

// 下面是傳入自定義tag的函數(shù)
public static void i(String tag, String msg)
{
    if (isDebug)
        Log.i(tag, msg);
}

public static void d(String tag, String msg)
{
    if (isDebug)
        Log.i(tag, msg);
}

public static void e(String tag, String msg)
{
    if (isDebug)
        Log.i(tag, msg);
}

public static void v(String tag, String msg)
{
    if (isDebug)
        Log.i(tag, msg);
}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容