Android Glide使用的詳解

1、在build.gradle中添加依賴:? ??

compile 'com.github.bumptech.glide:glide:3.7.0'

需要support-v4庫的支持,如果你的項(xiàng)目沒有support-v4庫(項(xiàng)目默認(rèn)已經(jīng)添加了),還需要添加support-v4依賴:? ? ?

?compile'com.Android.support:support-v4:23.3.0'

2、然后配置混淆規(guī)則:

-keeppublicclass

?*implements

?com.bumptech.glide.module.GlideModule

-keeppublic

enum?

com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$**

?{

**[] $VALUES;

public *;

?}

其中第一個(gè)混淆規(guī)則表明不混淆所有的GlideModule。

?如果需要的話,還需添加相應(yīng)的權(quán)限:

3、 使用Glide.with(this).load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png").into(imageView);

Glide.with()

使用with(Context context). 使用Application上下文,Glide請求將不受Activity/Fragment生命周期控制。

with(Activity activity).使用Activity作為上下文,Glide的請求會(huì)受到Activity生命周期控制。with(FragmentActivity activity).Glide的請求會(huì)受到FragmentActivity生命周期控制。with(android.app.Fragment fragment).Glide的請求會(huì)受到Fragment 生命周期控制。with(android.support.v4.app.Fragment fragment).Glide的請求會(huì)受到Fragment生命周期控制。

requestManager.load()

使用Glide基本可以load任何可以拿到的媒體資源,如:

?load SD卡資源:load("file://"+ Environment.getExternalStorageDirectory().getPath()+"/test.jpg") load assets資源:load("file:///android_asset/f003.gif") load raw資源:load("Android.resource://com.frank.glide/raw/raw_1")或load("android.resource://com.frank.glide/raw/"+R.raw.raw_1) load drawable資源:load("android.resource://com.frank.glide/drawable/news")或load("android.resource://com.frank.glide/drawable/"+R.drawable.news) load ContentProvider資源:load("content://media/external/images/media/139469") load http資源:load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg") load https資源:load(" http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg ")?

當(dāng)然,load不限于String類型,還可以:??

?load(Uri uri),load(File file),load(Integer resourceId),load(URL url),load(byte[] model),load(T model),loadFromMediaStore(Uri uri)。?

load的資源也可以是本地視頻,如果想要load網(wǎng)絡(luò)視頻或更高級的操作可以使用VideoView等其它控件完成。?

而且可以使用自己的ModelLoader進(jìn)行資源加載:

? using(ModelLoadermodelLoader, ClassdataClass),using(final StreamModelLoadermodelLoader),using(StreamByteArrayLoader modelLoader),using(final FileDescriptorModelLoadermodelLoader)。?

返回GenericRequestBuilder實(shí)例。

GenericRequestBuilder使用

GenericRequestBuilder是最頂層的Request Builder,用于處理選項(xiàng)設(shè)置和開始一般resource類型資源的加載。其中ModelType是指代表資源的類型,如"http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg"這個(gè)String就代表了一張圖片資源,所以這個(gè)ModelType就是String。DataType是指ModelLoader提供的,可以被ResourceDecoder解碼的數(shù)據(jù)類型。ResourceType是指將要加載的resource類型。TranscodeType是指已解碼的資源將要被轉(zhuǎn)成的資源類型。

1、thumbnail(float sizeMultiplier). 請求給定系數(shù)的縮略圖。如果縮略圖比全尺寸圖先加載完,就顯示縮略圖,否則就不顯示。系數(shù)sizeMultiplier必須在(0,1)之間,可以遞歸調(diào)用該方法。

2、sizeMultiplier(float sizeMultiplier). 在加載資源之前給Target大小設(shè)置系數(shù)。

3、diskCacheStrategy(DiskCacheStrategy strategy).設(shè)置緩存策略。DiskCacheStrategy.SOURCE:緩存原始數(shù)據(jù),DiskCacheStrategy.RESULT:緩存變換(如縮放、裁剪等)后的資源數(shù)據(jù),DiskCacheStrategy.NONE:什么都不緩存,DiskCacheStrategy.ALL:緩存SOURC和RESULT。默認(rèn)采用DiskCacheStrategy.RESULT策略,對于download only操作要使用DiskCacheStrategy.SOURCE。

4、priority(Priority priority). 指定加載的優(yōu)先級,優(yōu)先級越高越優(yōu)先加載,但不保證所有圖片都按序加載。枚舉Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。默認(rèn)為Priority.NORMAL。

5、dontAnimate(). 移除所有的動(dòng)畫。

6、animate(int animationId). 在異步加載資源完成時(shí)會(huì)執(zhí)行該動(dòng)畫。

7、animate(ViewPropertyAnimation.Animator animator). 在異步加載資源完成時(shí)會(huì)執(zhí)行該動(dòng)畫。

8、placeholder(int resourceId). 設(shè)置資源加載過程中的占位Drawable。

9、placeholder(Drawable drawable). 設(shè)置資源加載過程中的占位Drawable。

10、fallback(int resourceId). 設(shè)置model為空時(shí)要顯示的Drawable。如果沒設(shè)置fallback,model為空時(shí)將顯示error的Drawable,如果error的Drawable也沒設(shè)置,就顯示placeholder的Drawable。

11、fallback(Drawable drawable).設(shè)置model為空時(shí)顯示的Drawable。

12、error(int resourceId).設(shè)置load失敗時(shí)顯示的Drawable。

13、error(Drawable drawable).設(shè)置load失敗時(shí)顯示的Drawable。

14、listener(RequestListenerrequestListener). 監(jiān)聽資源加載的請求狀態(tài),可以使用兩個(gè)回調(diào):onResourceReady(R resource, T model, Targettarget, boolean isFromMemoryCache, boolean isFirstResource)和onException(Exception e, T model, Target target, boolean isFirstResource),但不要每次請求都使用新的監(jiān)聽器,要避免不必要的內(nèi)存申請,可以使用單例進(jìn)行統(tǒng)一的異常監(jiān)聽和處理。

15、skipMemoryCache(boolean skip). 設(shè)置是否跳過內(nèi)存緩存,但不保證一定不被緩存(比如請求已經(jīng)在加載資源且沒設(shè)置跳過內(nèi)存緩存,這個(gè)資源就會(huì)被緩存在內(nèi)存中)。

16、override(int width, int height). 重新設(shè)置Target的寬高值(單位為pixel)。

17、into(Y target).設(shè)置資源將被加載到的Target。

18、into(ImageView view). 設(shè)置資源將被加載到的ImageView。取消該ImageView之前所有的加載并釋放資源。

19、into(int width, int height). 后臺線程加載時(shí)要加載資源的寬高值(單位為pixel)。

20、preload(int width, int height). 預(yù)加載resource到緩存中(單位為pixel)。

21、asBitmap(). 無論資源是不是gif動(dòng)畫,都作為Bitmap對待。如果是gif動(dòng)畫會(huì)停在第一幀。

22、asGif().把資源作為GifDrawable對待。如果資源不是gif動(dòng)畫將會(huì)失敗,會(huì)回調(diào).error()。

4、技巧

?1、禁止內(nèi)存緩存:? ?

?.skipMemoryCache(true)

2、清除內(nèi)存緩存:? ?

?// 必須在UI線程中調(diào)用? ??

Glide.get(context).clearMemory();

3、禁止磁盤緩存:

? .diskCacheStrategy(DiskCacheStrategy.NONE)

4、清除磁盤緩存:?

?// 必須在后臺線程中調(diào)用,建議同時(shí)clearMemory()? Glide.get(applicationContext).clearDiskCache();

5、獲取緩存大小:?

new GetDiskCacheSizeTask(textView).execute(new File(getCacheDir(), DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));11class GetDiskCacheSizeTask extends AsyncTask{

private final TextView resultView;

public GetDiskCacheSizeTask(TextView resultView) {

this.resultView = resultView;

}

@Override

protected void onPreExecute() {

resultView.setText("Calculating...");

}

@Override

protected void onProgressUpdate(Long... values) { /* onPostExecute(values[values.length - 1]); */ }

@Override

protected Long doInBackground(File... dirs) {

try {

long totalSize = 0;

for (File dir : dirs) {

publishProgress(totalSize);

totalSize += calculateSize(dir);

}

return totalSize;

} catch (RuntimeException ex) {

final String message = String.format("Cannot get size of %s: %s", Arrays.toString(dirs), ex);

new Handler(Looper.getMainLooper()).post(new Runnable() {

@Override

public void run() {

resultView.setText("error");

Toast.makeText(resultView.getContext(), message, Toast.LENGTH_LONG).show(); ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?return 0L;

}

@Override

protected void onPostExecute(Long size) {

String sizeText = android.text.format.Formatter.formatFileSize(resultView.getContext(), size);

resultView.setText(sizeText);

}

private static long calculateSize(File dir) {

if (dir == null) return 0;

if (!dir.isDirectory()) return dir.length();

long result = 0;

File[] children = dir.listFiles();

if (children != null)

for (File child : children)

result += calculateSize(child);

return result;}

}

6、指定資源的優(yōu)先加載順序:??

//優(yōu)先加載

? ? ?Glide

? ? ? ? ? ? ?.with(context)

? ? ? ? ? ? ?.load(heroImageUrl)

? ? ? ? ? ? .priority(Priority.HIGH)

? ? ? ? ? ? .into(imageViewHero);

//后加載

? ? ? ?Glide

? ? ? ? ? ? .with(context)

? ? ? ? ? ? .load(itemImageUrl)

? ? ? ? ? ?.priority(Priority.LOW)

? ? ? ? ? ? .into(imageViewItem);

7、先顯示縮略圖,再顯示原圖:? ?

//用原圖的1/10作為縮略圖? ? Glide? ? ? ?

?.with(this) ? ? ? ? ? ? ? ?.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png") ? ? ? ? .thumbnail(0.1f)? ? ? ? .into(iv_0);? ? //用其它圖片作為縮略圖 ? ? ? ?DrawableRequestBuilderthumbnailRequest = Glide

.with(this)

.load(R.drawable.news);

Glide.with(this)

.load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")

.thumbnail(thumbnailRequest)

.into(iv_0);

8、對圖片進(jìn)行裁剪、模糊、濾鏡等處理:

?推薦使用獨(dú)立的圖片處理庫:wasabeef/glide-transformations,使用也很簡單:?

?? compile 'jp.wasabeef:glide-transformations:2.0.0'

之后我們就可以使用GenericRequestBuilder或其子類的transform()或bitmapTransform()方法設(shè)置圖片轉(zhuǎn)換了:? ?

?//圓形裁剪? ? Glide.with(this)? ? ? ? .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png") ? ? ? ? ? ? .bitmapTransform(new CropCircleTransformation(this)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??.into(iv_0); ?

? //圓角處理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??Glide.with(this)? ? ? ? .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")? ? ? ? .bitmapTransform(new RoundedCornersTransformation(this,30,0, RoundedCornersTransformation.CornerType.ALL)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.into(iv_0); ??

?//灰度處理? ?

?Glide.with(this)? ? ? ? .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")? ? ? ? .bitmapTransform(new GrayscaleTransformation(this)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??.into(iv_0); ? ?

//其它變換...

5、 Glide有哪些“坑”?

1、ImageView的setTag問題 問題描述: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??如果使用Glide的into(imageView)為ImageView設(shè)置圖片的同時(shí)使用ImageView的setTag(final Object tag)方法,將會(huì)導(dǎo)致java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting異常。因?yàn)镚lide的ViewTarget中通過view.setTag(tag)和view.getTag()標(biāo)記請求的,由于Android 4.0之前Tag存儲在靜態(tài)map里,如果Glide使用setTag(int key, final Object tag)方法標(biāo)記請求則可能會(huì)導(dǎo)致內(nèi)存泄露,所以Glide默認(rèn)使用view.setTag(tag)標(biāo)記請求,你就不能重復(fù)調(diào)用了。 解決辦法:如果你需要為ImageView設(shè)置Tag,必須使用setTag(int key, final Object tag)及getTag(int key)方法,其中key必須是合法的資源ID以確保key的唯一性,典型做法就是在資源文件中聲明type="id"的item資源。

2、placeholder()導(dǎo)致的圖片變形問題 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?問題描述:使用.placeholder()方法在某些情況下會(huì)導(dǎo)致圖片顯示的時(shí)候出現(xiàn)圖片變形的情況。這是因?yàn)镚lide默認(rèn)開啟的crossFade動(dòng)畫導(dǎo)致的TransitionDrawable繪制異常,詳細(xì)描述和討論可以看一下這個(gè)#363 issue。根本原因就是你的placeholder圖片和你要加載顯示的圖片寬高比不一樣,而Android的TransitionDrawable無法很好地處理不同寬高比的過渡問題,這的確是個(gè)Bug,是Android的也是Glide的。 解決辦法:使用.dontAnimate()方法禁用過渡動(dòng)畫,或者使用animate()方法自己寫動(dòng)畫,再或者自己修復(fù)TransitionDrawable的問題。

3、ImageView的資源回收問題 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 問題描述:默認(rèn)情況下,Glide會(huì)根據(jù)with()使用的Activity或Fragment的生命周期自動(dòng)調(diào)整資源請求以及資源回收。但是如果有很占內(nèi)存的Fragment或Activity不銷毀而僅僅是隱藏視圖,那么這些圖片資源就沒辦法及時(shí)回收,即使是GC的時(shí)候。 解決辦法:可以考慮使用WeakReference,如:? ? final WeakReferenceimageViewWeakReference = new WeakReference<>(imageView);

ImageView target = imageViewWeakReference.get();

if (target != null) {

Glide.with(context).load(uri).into(target);

}

4、ImageView的scaleType問題

scaleType默認(rèn)為fitCenter模式,如果你想設(shè)置成centerInside,不好意思,3.x還沒有這個(gè)方法,參見這個(gè)#591 issue,折中的解決辦法就是放棄使用centerInside,或者結(jié)合android:scaleType="centerInside"和.dontTransform()使用以禁止Glide對資源進(jìn)行轉(zhuǎn)換。

如果你想要ImageView的寬高根據(jù)圖片資源的大小而定(即使用wrap_comtent),那么你就必須明確告訴Glide我想加載原始資源:使用android:scaleType="center",或者.dontTransform(),或者.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)。

不推薦使用fitXY,因?yàn)檫@樣Glide會(huì)加載全尺寸圖像到內(nèi)存中而造成不必要的內(nèi)存占用。

5、異步線程完成后加載圖片的崩潰問題

問題描述:通常情況下,異步線程會(huì)被約束在Activity生命周期內(nèi),所以異步線程完成后使用Glide加載圖片是沒有問題的。但如果你的異步線程在Activity銷毀時(shí)沒有取消掉,那么異步線程完成后就Glide就無法為一個(gè)已銷毀的Activity加載圖片資源,拋出的異常如下(在with()方法中就進(jìn)行判斷并拋出異常):

java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)

at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)

at com.bumptech.glide.Glide.with(Glide.java:653)

at com.frank.glidedemo.TestActivity.onGetDataCompleted(TestActivity.java:23)

at com.frank.glidedemo.TestActivity.access$000(TestActivity.java:10)

at com.frank.glidedemo.TestActivity$BackgroundTask.onPostExecute(TestActivity.java:46)

at com.frank.glidedemo.TestActivity$BackgroundTask.onPostExecute(TestActivity.java:28)

at android.os.AsyncTask.finish(AsyncTask.java:632)

at android.os.AsyncTask.access$600(AsyncTask.java:177)

at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:157)

at android.app.ActivityThread.main(ActivityThread.java:5356)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)

at dalvik.system.NativeStart.main(Native Method)

}

解決辦法:正確管理Background Threads(異步線程),當(dāng)Activity停止或銷毀時(shí),停止所有相關(guān)的異步線程,停止所有后續(xù)的UI操作。或者加載前使用isFinishing()或isDestroyed()進(jìn)行限制(不建議這種處理方式)。

6、由于Bitmap復(fù)用導(dǎo)致的在某些設(shè)備上圖片錯(cuò)亂的問題

問題描述: Glide默認(rèn)使用BitmapPool的方式對應(yīng)用中用到的Bitmap進(jìn)行復(fù)用,以減少頻繁的內(nèi)存申請和內(nèi)存回收,而且默認(rèn)使用的Bitmap模式為RGB565以減少內(nèi)存開銷。但在某些設(shè)備上(通常在Galaxy系列5.X設(shè)備上很容易復(fù)現(xiàn))某些情況下會(huì)出現(xiàn)圖片加載錯(cuò)亂的問題,具體詳見這個(gè)#601 issue。原因初步確定是OpenGL紋理渲染異常。

解決辦法:GlideModule使用PREFER_ARGB_8888(Glide4.X已經(jīng)默認(rèn)使用該模式了),雖然內(nèi)存占用比RGB565更多一點(diǎn),但可以更好地處理有透明度Bitmap的復(fù)用問題?;蛘呓肂itmap復(fù)用setBitmapPool(new BitmapPoolAdapter())來修復(fù)這個(gè)問題(不推薦這種處理方式)

6、Picasso和Glide的區(qū)別

1、Glide比Picasso加載速度快

2、默認(rèn)情況Glide更有利于減少OutOfMemoryError的發(fā)生,不過Picasso的圖片質(zhì)量更高

3、Glide支持gif,Picasso不支持

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,662評論 25 708
  • 一、簡介 在泰國舉行的谷歌開發(fā)者論壇上,谷歌為我們介紹了一個(gè)名叫Glide的圖片加載庫,作者是bumptech。這...
    天天大保建閱讀 7,520評論 2 28
  • 簡歷從一開始的基本框架,到動(dòng)手制作填寫,已經(jīng)斷斷續(xù)續(xù)準(zhǔn)備了一個(gè)多月,應(yīng)屆生的簡歷內(nèi)容很少,在計(jì)劃之中,校園經(jīng)歷和實(shí)...
    王家人寧閱讀 781評論 0 0
  • 平常下班沒事做,畫畫畫著玩兒~作為一個(gè)門外漢,沒有專業(yè)基礎(chǔ),畫得也不專業(yè),全是晚上在床上用懶人桌畫的,買的飛樂鳥的...
    墨陌沫92閱讀 260評論 2 2
  • 今天,你26歲了 和我一樣大,大了幾個(gè)月 去年的九月回來泉州,開啟了新的旅程,然后遇到一群好玩的人,遇到了你 在生...
    井姐吖閱讀 475評論 0 3