解决RecyclerView卡顿的问题,找过很多问题的引发点,最后的解决灵感来自于这里:
onBindView里的IO操作导致RecyclerView scroll 卡顿
在项目中查找,发现onBindView中多图片使用Glide加载时确实是有保存bitmap到文件的IO操作,将IO操作注释掉,运行App,卡顿消失,这样,开始对IO动刀;
首先想到,每个IO操作新开线程来处理,为加快线程速度,保证预期效果不打太大折扣,想到利用ThreadPoolExecutor或者是ExecutorService进行
代码:
/*
* 保存 bitmap到文件,并将文件路径返回,利用线程池新开IO线程,解决滚动时卡顿的问题
* */
public static String getFilePath(final Bitmap bitmap, String fileName) {
final File picDir = Environment.getExternalStoragePublicDirectory(AppConfig.DIR_ROOT_PIC);
final File f = new File(picDir, fileName + AppConfig.FILE_NAME_EXTENSION_PIC);
try {
final FileOutputStream fOut = new FileOutputStream(f);
App.getThreadPool().execute(new Runnable() {
@Override
public void run() {
try {
f.createNewFile();
bitmap.compress(Bitmap.CompressFormat.PNG, 30, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return f.getAbsolutePath();
}
这样,就在保证recyclerView平滑滚动的同时,保存了Bitmap到本地。