阻塞I/O的操作會導致App必須等待結(jié)果返回(阻塞結(jié)束)才能進行下一步操作。在UI線程上執(zhí)行一個阻塞操作會將UI強行卡住,直接造成很糟糕的用戶體驗。
我們激活StrictMode后,我們開始收到了關于我們的App錯誤操作磁盤I/O的不良信息。
D/StrictMode StrictMode policy violation; ~duration=998 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=31 violation=2
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk (StrictMode.java:1135)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:106) at libcore.io.IoBridge.open(IoBridge.java:393)
at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
at android.app.ContextImpl.openFileOutput(ContextImpl.java:918)
at android.content.ContextWrapper.openFileOutput(ContextWrapper. java:185)
at com.packtpub.apps.rxjava_essentials.Utils.storeBitmap (Utils.java:30)
上一條信息告訴我們Utils.storeBitmap()函數(shù)執(zhí)行完耗時998ms:在UI線程上近1秒的不必要的工作和App上近1秒不必要的遲鈍。這是因為我們以阻塞的方式訪問磁盤。我們的storeBitmap()函數(shù)包含了:
FileOutputStream fOut = context.openFileOutput(filename, Context.MODE_PRIVATE);
它直接訪問智能手機的固態(tài)存儲然后就慢了。我們該如何提高訪問速度呢?storeBitmap()函數(shù)保存了已安裝App的圖標。他的返回值類型為void,因此在執(zhí)行下一個操作前我們毫無理由去等待直到它完成。我們可以啟動它并讓它執(zhí)行在不同的線程。近幾年來Android的線程管理發(fā)生了許多變化,導致App出現(xiàn)詭異的行為。我們可以使用AsyncTask,但是我們要避免掉入前幾章里的onPre... onPost...doInBackGround地獄。下面我們將換用RxJava的方式。調(diào)度器萬歲!