ImageLoad使用筆記

ImageLoad簡介


ImageLoad是現(xiàn)在在Android開發(fā)過程中廣泛使用的開源圖片加載框架,該項(xiàng)目的Git源碼:https://github.com/nostra13/Android-Universal-Image-Loader,ImageLoad的具有以下特點(diǎn):
1.多線程下載圖片腕唧,圖片可以來源于網(wǎng)絡(luò)枣耀,文件系統(tǒng)澜驮,項(xiàng)目文件夾assets中以及drawable中等;
2.支持隨意的配置ImageLoader贸辈,例如線程池,圖片下載器游沿,內(nèi)存緩存策略,硬盤緩存策略肮砾,圖片顯示選項(xiàng)以及其他的一些配置;
3.支持圖片的內(nèi)存緩存诀黍,文件系統(tǒng)緩存或者SD卡緩存;
4.支持圖片下載過程的監(jiān)聽;
5.根據(jù)控件(ImageView)的大小對(duì)Bitmap進(jìn)行裁剪,減少Bitmap占用過多的內(nèi)存;
6.較好的控制圖片的加載過程仗处,例如暫停圖片加載眯勾,重新開始加載圖片,一般使用在ListView,GridView中婆誓,滑動(dòng)過程中暫停加載圖片吃环,停止滑動(dòng)的時(shí)候去加載圖片;
7.提供在較慢的網(wǎng)絡(luò)下對(duì)圖片進(jìn)行加載

ImageLoad的具體使用方法:


1.新建一個(gè)Android項(xiàng)目,下載JAR包添加到工程libs目錄下
2.新建一個(gè)MyApplication繼承Application洋幻,并在onCreate()中創(chuàng)建ImageLoader的配置參數(shù)郁轻,并初始化到ImageLoader中代碼如下:

package com.example.uil;  
  
import com.nostra13.universalimageloader.core.ImageLoader;  
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  
import android.app.Application;  
  
public class MyApplication extends Application {  
  
    @Override  
    public void onCreate() {  
        super.onCreate();  
  
        //創(chuàng)建默認(rèn)的ImageLoader配置參數(shù)  
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration  
                .createDefault(this);  
          
        //Initialize ImageLoader with configuration.  
        ImageLoader.getInstance().init(configuration);  
    }  
  
}  

ImageLoaderConfiguration是圖片加載器ImageLoader的配置參數(shù),使用了建造者模式文留,這里是直接使用了createDefault()方法創(chuàng)建一個(gè)默認(rèn)的ImageLoaderConfiguration范咨,當(dāng)然我們還可以自己設(shè)置ImageLoaderConfiguration故觅,設(shè)置如下:

File cacheDir = StorageUtils.getCacheDirectory(context);  
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)  
        .memoryCacheExtraOptions(480, 800) // 內(nèi)存緩存圖片的最大寬高,默認(rèn)為屏幕寬高
        .diskCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)  // 磁盤緩存圖片的設(shè)置
        .taskExecutor(...)  // 緩存線程池
        .taskExecutorForCachedImages(...)  // 下載緩存圖片的線程池
        .threadPoolSize(3) // 線程池?cái)?shù)渠啊,默認(rèn)為3
        .threadPriority(Thread.NORM_PRIORITY - 1) // 線程優(yōu)先級(jí) 
        .tasksProcessingOrder(QueueProcessingType.FIFO) // 下載和顯示的工作隊(duì)列排序  
        .denyCacheImageMultipleSizesInMemory()  // 緩存顯示不同大小的同一張圖片
        .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) // 指定內(nèi)存緩存的實(shí)現(xiàn)方式
        .memoryCacheSize(2 * 1024 * 1024)  // 設(shè)置內(nèi)存緩存的最大字節(jié)
        .memoryCacheSizePercentage(13) // 設(shè)置內(nèi)存緩存最大大小占當(dāng)前應(yīng)用可用內(nèi)存的百分比
        .diskCache(new UnlimitedDiscCache(cacheDir)) // 指定磁盤緩存的實(shí)現(xiàn)方式
        .diskCacheSize(50 * 1024 * 1024)  // 設(shè)置磁盤緩存的最大字節(jié)
        .diskCacheFileCount(100)  // 磁盤緩存文件數(shù)
        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // 磁盤緩存文件的命名規(guī)則
        .imageDownloader(new BaseImageDownloader(context)) // 設(shè)置圖片下載器输吏,負(fù)責(zé)從圖片的各個(gè)來源獲取輸入流 
        .imageDecoder(new BaseImageDecoder()) // 設(shè)置圖片解碼器,負(fù)責(zé)將圖片輸入流InputStream轉(zhuǎn)換為Bitmap對(duì)象
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // 缺省的圖片顯示的配置項(xiàng)  
        .writeDebugLogs()  // 打印debug log
        .build();  

上面的這些就是所有的選項(xiàng)配置替蛉,我們?cè)陧?xiàng)目中不需要每一個(gè)都自己設(shè)置贯溅,一般使用createDefault()創(chuàng)建的ImageLoaderConfiguration就能使用,然后調(diào)用ImageLoader的init()方法將ImageLoaderConfiguration參數(shù)傳遞進(jìn)去躲查,ImageLoader使用單例模式它浅。
3.配置Android Manifest文件

<manifest>  
    <uses-permission android:name="android.permission.INTERNET" />  
    <!-- Include next permission if you want to allow UIL to cache images on SD card -->  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    ...  
    <application android:name="MyApplication">  
        ...  
    </application>  
</manifest>  

4.加載圖片
ImageLader提供了幾個(gè)圖片加載的方法,主要是這幾個(gè)displayImage(), loadImage(),loadImageSync()镣煮,loadImageSync()方法是同步的姐霍,android4.0有個(gè)特性,網(wǎng)絡(luò)操作不能在主線程典唇,所以loadImageSync()方法我們就不去使用

1.loadImage()方法來加載網(wǎng)絡(luò)圖片

final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "http://img.showcdn.cn/uploads/allimg/160307/20-16030G15J1435.jpg";  
          
        ImageLoader.getInstance().loadImage(imageUrl, new ImageLoadingListener() {  
              
            @Override  
            public void onLoadingStarted(String imageUri, View view) {  
                  //開始加載的時(shí)候回調(diào)
            }  
              
            @Override  
            public void onLoadingFailed(String imageUri, View view,  
                    FailReason failReason) {  
                  //加載失敗的時(shí)候回調(diào)
            }  
              
            @Override  
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {  
                //加載完成的時(shí)候回調(diào)
                mImageView.setImageBitmap(loadedImage);  
            }  
              
            @Override  
            public void onLoadingCancelled(String imageUri, View view) {  
                  //取消加載的時(shí)候回調(diào)
            }  
        });  

傳入圖片的url和ImageLoaderListener, 在回調(diào)方法onLoadingComplete()中將loadedImage設(shè)置到ImageView上面就行了镊折,如果你覺得傳入ImageLoaderListener太復(fù)雜了,我們可以使用SimpleImageLoadingListener類介衔,該類提供了ImageLoaderListener接口方法的空實(shí)現(xiàn)恨胚,使用的是缺省適配器模式

final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "http://img.showcdn.cn/uploads/allimg/160307/20-16030G15J1435.jpg";  
          
        ImageLoader.getInstance().loadImage(imageUrl, new SimpleImageLoadingListener(){  
  
            @Override  
            public void onLoadingComplete(String imageUri, View view,  
                    Bitmap loadedImage) {  
                super.onLoadingComplete(imageUri, view, loadedImage);  
                mImageView.setImageBitmap(loadedImage);  
            }  
              
        });  

如果我們要指定圖片的大小該怎么辦呢,這也好辦炎咖,初始化一個(gè)ImageSize對(duì)象赃泡,指定圖片的寬和高,代碼如下

final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "http://img.showcdn.cn/uploads/allimg/160307/20-16030G15J1435.jpg";  
          
        ImageSize mImageSize = new ImageSize(100, 100);  
          
        ImageLoader.getInstance().loadImage(imageUrl, mImageSize, new SimpleImageLoadingListener(){  
  
            @Override  
            public void onLoadingComplete(String imageUri, View view,  
                    Bitmap loadedImage) {  
                super.onLoadingComplete(imageUri, view, loadedImage);  
                mImageView.setImageBitmap(loadedImage);  
            }  
              
        });  

上面只是很簡單的使用ImageLoader來加載網(wǎng)絡(luò)圖片乘盼,在實(shí)際的開發(fā)中升熊,我們并不會(huì)這么使用,那我們平常會(huì)怎么使用呢绸栅?我們會(huì)用到DisplayImageOptions僚碎,他可以配置一些圖片顯示的選項(xiàng),比如圖片在加載中ImageView顯示的圖片阴幌,是否需要使用內(nèi)存緩存勺阐,是否需要使用文件緩存等等,可供我們選擇的配置如下

DisplayImageOptions options = new DisplayImageOptions.Builder()  
        .showImageOnLoading(R.drawable.ic_stub) // 加載未完成時(shí)顯示的自定義圖片  
        .showImageForEmptyUri(R.drawable.ic_empty) // 鏈接為空時(shí)的占位圖  
        .showImageOnFail(R.drawable.ic_error) // 加載失敗時(shí)顯示自定義圖片
        .resetViewBeforeLoading(false)  // 在加載前是否重置 view ,默認(rèn)為false 
        .delayBeforeLoading(1000)  //設(shè)置在開始加載前的延遲時(shí)間矛双,單位為毫秒
        .cacheInMemory(false) // 是否啟用內(nèi)存緩存渊抽,默認(rèn)為false  
        .cacheOnDisk(false) // 是否啟用磁盤緩存,默認(rèn)為false
        .preProcessor(...)  // 緩存在內(nèi)存之前的處理程序
        .postProcessor(...)  // 緩存在內(nèi)存之后的處理程序
        .extraForDownloader(...)  // 下載器需要的輔助信息
        .considerExifParams(false) // 是否考慮圖片的 EXIF 信息议忽,默認(rèn)為false
        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // 圖片的縮放類型  
        .bitmapConfig(Bitmap.Config.ARGB_8888) // 圖片的色彩格式
        .decodingOptions(...)  // 為 BitmapFactory.Options懒闷,用于得到圖片尺寸等信息
        .displayer(new SimpleBitmapDisplayer()) // 圖片的顯示方式
        .handler(new Handler()) // handler 對(duì)象,消息處理
        .build();  

我們將上面的代碼稍微修改下

final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg";  
        ImageSize mImageSize = new ImageSize(100, 100);  
          
        //顯示圖片的配置  
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
                .cacheInMemory(true)  
                .cacheOnDisk(true)  
                .bitmapConfig(Bitmap.Config.RGB_565)  
                .build();  
          
        ImageLoader.getInstance().loadImage(imageUrl, mImageSize, options, new SimpleImageLoadingListener(){  
  
            @Override  
            public void onLoadingComplete(String imageUri, View view,  
                    Bitmap loadedImage) {  
                super.onLoadingComplete(imageUri, view, loadedImage);  
                mImageView.setImageBitmap(loadedImage);  
            }  
              
        });  

我們使用了DisplayImageOptions來配置顯示圖片的一些選項(xiàng),這里我添加了將圖片緩存到內(nèi)存中已經(jīng)緩存圖片到文件系統(tǒng)中,這樣我們就不用擔(dān)心每次都從網(wǎng)絡(luò)中去加載圖片了愤估,是不是很方便呢帮辟,但是DisplayImageOptions選項(xiàng)中有些選項(xiàng)對(duì)于loadImage()方法是無效的,比如showImageOnLoading, showImageForEmptyUri等玩焰。

displayImage()加載圖片

接下來我們就來看看網(wǎng)絡(luò)圖片加載的另一個(gè)方法displayImage()由驹,代碼如下

final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg";  
          
        //顯示圖片的配置  
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
                .showImageOnLoading(R.drawable.ic_stub)  
                .showImageOnFail(R.drawable.ic_error)  
                .cacheInMemory(true)  
                .cacheOnDisk(true)  
                .bitmapConfig(Bitmap.Config.RGB_565)  
                .build();  
          
        ImageLoader.getInstance().displayImage(imageUrl, mImageView, options);  

從上面的代碼中,我們可以看出昔园,使用displayImage()比使用loadImage()方便很多蔓榄,也不需要添加ImageLoadingListener接口,我們也不需要手動(dòng)設(shè)置ImageView顯示Bitmap對(duì)象默刚,直接將ImageView作為參數(shù)傳遞到displayImage()中就行了甥郑,圖片顯示的配置選項(xiàng)中,我們添加了一個(gè)圖片加載中ImageVIew上面顯示的圖片荤西,以及圖片加載出現(xiàn)錯(cuò)誤顯示的圖片澜搅,效果如下,剛開始顯示ic_stub圖片邪锌,如果圖片加載成功顯示圖片勉躺,加載產(chǎn)生錯(cuò)誤顯示ic_error,這個(gè)方法使用起來比較方便秃流,而且使用displayImage()方法 他會(huì)根據(jù)控件的大小和imageScaleType來自動(dòng)裁剪圖片赂蕴,我們修改下MyApplication柳弄,開啟Log打印

public class MyApplication extends Application {  
  
    @Override  
    public void onCreate() {  
        super.onCreate();  
  
        //創(chuàng)建默認(rèn)的ImageLoader配置參數(shù)  
        ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)  
        .writeDebugLogs() //打印log信息  
        .build();  
          
          
        //Initialize ImageLoader with configuration.  
        ImageLoader.getInstance().init(configuration);  
    }  
  
}  
Paste_Image.png

第一條信息中舶胀,告訴我們開始加載圖片,打印出圖片的url以及圖片的最大寬度和高度碧注,圖片的寬高默認(rèn)是設(shè)備的寬高嚣伐,當(dāng)然如果我們很清楚圖片的大小,我們也可以去設(shè)置這個(gè)大小萍丐,在ImageLoaderConfiguration的選項(xiàng)中memoryCacheExtraOptions(int maxImageWidthForMemoryCache, int maxImageHeightForMemoryCache)
第二條信息顯示我們加載的圖片來源于網(wǎng)絡(luò)
第三條信息顯示圖片的原始大小為1024 x 682 經(jīng)過裁剪變成了512 x 341
第四條顯示圖片加入到了內(nèi)存緩存中轩端,我這里沒有加入到sd卡中,所以沒有加入文件緩存的Log

我們?cè)诩虞d網(wǎng)絡(luò)圖片的時(shí)候逝变,經(jīng)常有需要顯示圖片下載進(jìn)度的需求基茵,Universal-Image-Loader當(dāng)然也提供這樣的功能,只需要在displayImage()方法中傳入ImageLoadingProgressListener接口就行了壳影,代碼如下

imageLoader.displayImage(imageUrl, mImageView, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() {  
              
            @Override  
            public void onProgressUpdate(String imageUri, View view, int current,  
                    int total) {  
                  
            }  
        }); 

由于displayImage()方法中帶ImageLoadingProgressListener參數(shù)的方法都有帶ImageLoadingListener參數(shù)拱层,所以我這里直接new 一個(gè)SimpleImageLoadingListener,然后我們就可以在回調(diào)方法onProgressUpdate()得到圖片的加載進(jìn)度宴咧。

加載其他來源的圖片

使用Universal-Image-Loader框架不僅可以加載網(wǎng)絡(luò)圖片根灯,還可以加載sd卡中的圖片,Content provider等,使用也很簡單烙肺,只是將圖片的url稍加的改變下就行了纳猪,下面是加載文件系統(tǒng)的圖片

//顯示圖片的配置  
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
                .showImageOnLoading(R.drawable.ic_stub)  
                .showImageOnFail(R.drawable.ic_error)  
                .cacheInMemory(true)  
                .cacheOnDisk(true)  
                .bitmapConfig(Bitmap.Config.RGB_565)  
                .build();  
          
        final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imagePath = "/mnt/sdcard/image.png";  
        String imageUrl = Scheme.FILE.wrap(imagePath);  
          
        imageLoader.displayImage(imageUrl, mImageView, options);  

當(dāng)然還有來源于Content provider,drawable,assets中,使用的時(shí)候也很簡單桃笙,我們只需要給每個(gè)圖片來源的地方加上Scheme包裹起來(Content provider除外)氏堤,然后當(dāng)做圖片的url傳遞到imageLoader中,Universal-Image-Loader框架會(huì)根據(jù)不同的Scheme獲取到輸入流

        //圖片來源于Content provider  
        String contentprividerUrl = "content://media/external/audio/albumart/13";  
          
        //圖片來源于assets  
        String assetsUrl = Scheme.ASSETS.wrap("image.png");  
          
        //圖片來源于  
        String drawableUrl = Scheme.DRAWABLE.wrap("R.drawable.image");  

GirdView,ListView加載圖片

相信大部分人都是使用GridView怎栽,ListView來顯示大量的圖片丽猬,而當(dāng)我們快速滑動(dòng)GridView,ListView熏瞄,我們希望能停止圖片的加載脚祟,而在GridView,ListView停止滑動(dòng)的時(shí)候加載當(dāng)前界面的圖片强饮,這個(gè)框架當(dāng)然也提供這個(gè)功能由桌,使用起來也很簡單,它提供了PauseOnScrollListener這個(gè)類來控制ListView,GridView滑動(dòng)過程中停止去加載圖片邮丰,該類使用的是代理模式

listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  
        gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  

第一個(gè)參數(shù)就是我們的圖片加載對(duì)象ImageLoader, 第二個(gè)是控制是否在滑動(dòng)過程中暫停加載圖片行您,如果需要暫停傳true就行了,第三個(gè)參數(shù)控制猛的滑動(dòng)界面的時(shí)候圖片是否加載

OutOfMemoryError

雖然這個(gè)框架有很好的緩存機(jī)制剪廉,有效的避免了OOM的產(chǎn)生娃循,一般的情況下產(chǎn)生OOM的概率比較小,但是并不能保證OutOfMemoryError永遠(yuǎn)不發(fā)生斗蒋,這個(gè)框架對(duì)于OutOfMemoryError做了簡單的catch,保證我們的程序遇到OOM而不被crash掉捌斧,但是如果我們使用該框架經(jīng)常發(fā)生OOM,我們應(yīng)該怎么去改善呢泉沾?

  • 減少線程池中線程的個(gè)數(shù)捞蚂,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推薦配置1-5
  • 在DisplayImageOptions選項(xiàng)中配置bitmapConfig為Bitmap.Config.RGB_565跷究,因?yàn)槟J(rèn)是ARGB_8888姓迅, 使用RGB_565會(huì)比使用ARGB_8888少消耗2倍的內(nèi)存
  • 在ImageLoaderConfiguration中配置圖片的內(nèi)存緩存為memoryCache(new WeakMemoryCache()) 或者不使用內(nèi)存緩存
  • 在DisplayImageOptions選項(xiàng)中設(shè)置imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

通過上面這些,相信大家對(duì)Universal-Image-Loader框架的使用已經(jīng)非常的了解了俊马,我們?cè)谑褂迷摽蚣艿臅r(shí)候盡量的使用displayImage()方法去加載圖片丁存,loadImage()是將圖片對(duì)象回調(diào)到ImageLoadingListener接口的onLoadingComplete()方法中,需要我們手動(dòng)去設(shè)置到ImageView上面柴我,displayImage()方法中解寝,對(duì)ImageView對(duì)象使用的是Weak references,方便垃圾回收器回收ImageView對(duì)象屯换,如果我們要加載固定大小的圖片的時(shí)候编丘,使用loadImage()方法需要傳遞一個(gè)ImageSize對(duì)象与学,而displayImage()方法會(huì)根據(jù)ImageView對(duì)象的測量值,或者android:layout_width and android:layout_height設(shè)定的值嘉抓,或者android:maxWidth and/or android:maxHeight設(shè)定的值來裁剪圖片
[轉(zhuǎn)自]{http://blog.csdn.net/xiaanming/article/details/26810303}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末索守,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抑片,更是在濱河造成了極大的恐慌卵佛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敞斋,死亡現(xiàn)場離奇詭異截汪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)植捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門衙解,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焰枢,你說我怎么就攤上這事蚓峦。” “怎么了济锄?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵暑椰,是天一觀的道長。 經(jīng)常有香客問我荐绝,道長一汽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任低滩,我火速辦了婚禮召夹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘委造。我一直安慰自己戳鹅,他們只是感情好均驶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布昏兆。 她就那樣靜靜地躺著,像睡著了一般妇穴。 火紅的嫁衣襯著肌膚如雪爬虱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天腾它,我揣著相機(jī)與錄音跑筝,去河邊找鬼。 笑死瞒滴,一個(gè)胖子當(dāng)著我的面吹牛曲梗,可吹牛的內(nèi)容都是我干的赞警。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虏两,長吁一口氣:“原來是場噩夢啊……” “哼愧旦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起定罢,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤笤虫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祖凫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼蚯,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年惠况,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遭庶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稠屠,死狀恐怖罚拟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情完箩,我是刑警寧澤赐俗,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弊知,受9級(jí)特大地震影響阻逮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秩彤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一叔扼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漫雷,春花似錦瓜富、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓄坏,卻和暖如春价捧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涡戳。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工结蟋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渔彰。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓嵌屎,卻偏偏與公主長得像推正,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宝惰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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