Android开发中加载相册是很常用的功能,但相册图片过多正常加载会产生卡顿,即便使用线程异步加载图片卡顿问题依然得不到改善。 正常代码:
public class AlbumAdapter extends ?{
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(bitmap!=null){
线程加载图片
}
else
读取缓存
}
}
卡顿原因是无论怎样优化读取IO都是费时的工作,adapter又会一次实例多个子项,导致加载的图片过多,内存占用率过高产生了卡顿。 优化代码:
public class AlbumActivity extends AppCompatActivity{
private RecyclerView mRecyclerView;
private List photoItemList;
private List selectItemList;
private int[] photoLayout;
private AlbumAdapter mAdapter;
private Handler handler;
private Button submit;
private GridLayoutManager gridLayoutManager;
private static final String[] STORE_IMAGES = {
MediaStore.Images.Media.DISPLAY_NAME, // 显示的名字
MediaStore.Images.Media.LATITUDE, // 维度
MediaStore.Images.Media.LONGITUDE, // 经度
MediaStore.Images.Media._ID, // id
MediaStore.Images.Media.BUCKET_ID, // dir id 目录
MediaStore.Images.Media.BUCKET_DISPLAY_NAME, // dir name 目录名字
MediaStore.Images.Media.DATA//路径
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_album);
submit = (Button)findViewById(R.id.submit);
mRecyclerView = (RecyclerView)findViewById(R.id.list);
gridLayoutManager = new GridLayoutManager(this, 3);
mRecyclerView.setLayoutManager(gridLayoutManager);
mRecyclerView.setHasFixedSize(true);
photoLayout = new int[2];
photoLayout[0]=(ScreenHelper.getScreenWidth(this) - ScreenHelper.dp2px(this, 20)) / 3 - ScreenHelper.dp2px(this, 10);
photoLayout[1] = ScreenHelper.dp2px(this, 110);
gridLayoutManager.findFirstCompletelyVisibleItemPosition();
initPhoto();
notifySubmit();
mAdapter = new AlbumAdapter(mRecyclerView,photoItemList,selectItemList);
mAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(RecyclerView.ViewHolder viewHolder, int position) {
notifySubmit();
}
});
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
//停止滑动后缓存当前屏幕图片
if(newState == 0){
new Thread(new Runnable() {
@Override
public void run() {
for(int i=gridLayoutManager.findFirstVisibleItemPosition();i |