커서 어댑터에서 활주를 사용하여 수천 개의보기를로드합니다. 그들은 모두 디스크에서로드 된 작은 이미지를 가지고 있습니다 (모두 10kb 미만). 그러나 나는 얼어 붙는 문제가 글라이드 라이브러리에서 오는 것 (그러나 그것은 커서로 인해 발생할 수 있습니다). 아래 코드와 로그 파일을 첨부했습니다.Glide로 RecyclerView 고정
관련 CursorAdapter 번호 :
public FilesFragmentCursorAdapter(Activity context, Cursor cursor, Bucket bucket) {
super(context, cursor, 0);
mContext = context;
this.cursor = cursor;
mBucket = bucket;
mSelectedItemsIds = new SparseBooleanArray();
downloader = new ThumbnailDownloader(mContext, mBucket);
manager = GlideApp.with(mContext);
inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mShowThumbnails = mContext.getSharedPreferences(Constants.PREFS, Context.MODE_PRIVATE).getBoolean(Constants.PREFS_SHOW_THUMBNAILS, false);
}
@Override
public Object getItem(int position) {
return super.getItem(position);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return LayoutInflater.from(context).inflate(R.layout.list_file_item, viewGroup, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
FileViewHolder holder = new FileViewHolder();
holder.mId = view.findViewById(R.id.list_file_id);
holder.mName = view.findViewById(R.id.list_file_name);
holder.mSize = view.findViewById(R.id.list_file_size);
holder.mCreated = view.findViewById(R.id.list_file_date);
holder.image = view.findViewById(R.id.list_file_image);
holder.container = view.findViewById(R.id.list_file_item);
String id = cursor.getString(cursor.getColumnIndex(KEY_PID));
String name = cursor.getString(cursor.getColumnIndex(KEY_NAME));
long size = cursor.getLong(cursor.getColumnIndex(KEY_SIZE));
String created = cursor.getString(cursor.getColumnIndex(KEY_CREATED_AT));
String mimeType = cursor.getString(cursor.getColumnIndex(KEY_MIME));
if (id != null) holder.mId.setText(id);
if (name != null) holder.mName.setText(name);
String fileSize = Formatter.formatFileSize(mContext, size);
holder.mSize.setText(fileSize);
if (created != null && created.length() > 10) {
String fileCreatedDate = created.substring(0, 10);
holder.mCreated.setText(fileCreatedDate);
}
if (mimeType != null) {
if (mimeType.contains("image")) {
holder.image.setImageResource(R.drawable.ic_image_black_48dp);
if (mShowThumbnails) {
String thumbnailPath = cursor.getString(cursor.getColumnIndex(KEY_THUMBNAIL));
if (!TextUtils.isEmpty(thumbnailPath)) {
manager.load(thumbnailPath).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.image);
} else {
File current = DatabaseHelper.createFileFromCursor(cursor);
downloader.download(current);
}
}
} else if (mimeType.contains("video")) {
holder.image.setImageResource(R.drawable.ic_videocam_black_48dp);
} else if (mimeType.contains("text")) {
holder.image.setImageResource(R.drawable.ic_text_format_black_48dp);
} else if (mimeType.contains("audio")) {
holder.image.setImageResource(R.drawable.ic_audiotrack_black_48dp);
} else {
holder.image.setImageResource(R.drawable.ic_insert_drive_file_black_48dp);
}
}
}
로그 : 논의
12-28 21:47:17.212 27355-27450/co.intellidev.storj E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 0, fds[i] is -1, fd_count is 1, error: Too many open files
12-28 21:47:20.150 27355-27752/co.intellidev.storj E/libEGL: error creating cache file /data/user_de/0/co.intellidev.storj/code_cache/com.android.opengl.shaders_cache: Too many open files (24)
12-28 21:50:02.744 27355-27450/co.intellidev.storj E/GraphicBuffer: unflatten: registerBuffer failed: Unknown error -5 (5)
12-28 21:50:02.748 27355-27450/co.intellidev.storj E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: 5
12-28 21:50:02.752 27355-27450/co.intellidev.storj E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files
12-28 21:50:02.752 27355-27450/co.intellidev.storj E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22
12-28 21:50:02.754 27355-27450/co.intellidev.storj E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files
12-28 21:50:02.754 27355-27450/co.intellidev.storj E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22
은 전체 recyclerview 클래스를 제공합니다. – Aks4125
어댑터 레이아웃에서 활주를 사용할 때 listview가 실제로 앱을 고정시킵니다. 대신 recyclerview를 사용하십시오. – AloDev
@ Aks4125 사용자 정의 recyclerview 클래스가 아닙니다 –