首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RecyclerView与滑动冷冻

RecyclerView与滑动冷冻
EN

Stack Overflow用户
提问于 2017-12-29 02:59:14
回答 1查看 1.7K关注 0票数 0

我正在使用游标适配器中的滑动来加载数千个视图。它们都有一个从磁盘加载到它们的小映像(都小于10 to )。然而,我正在冻结,问题似乎来自于幻灯片库(不管它可能是由于光标加载程序)。我在下面附上了我的代码和日志文件。

相关的CursorAdapter代码:

代码语言:javascript
运行
复制
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);
            }
        }
    }

日志:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-30 04:43:38

如所讨论的.

代码语言:javascript
运行
复制
public class FilesFragmentCursorAdapter extends RecyclerView.Adapter<FilesFragmentCursorAdapter.FileViewHolder > {
/* objects */
public FilesFragmentCursorAdapter(Activity context, Cursor cursor, Bucket bucket) {
    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 FilesFragmentCursorAdapter.FileViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_file_item, parent, false);
    return new FileViewHolder(itemView); // <- render view here
}

@Override
public void onBindViewHolder(FilesFragmentCursorAdapter.FileViewHolder  holder, final int position) {
    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);

}



@Override
public int getItemCount() {
    return contactsList.size();
}

public class FileViewHolder  extends RecyclerView.ViewHolder {
    private TextView mId;
    private TextView mName;
    private TextView mSize;
    // so on
    public FileViewHolder (View view) {
        super(view);
        mId = view.findViewById(R.id.list_file_id);
        mName = view.findViewById(R.id.list_file_name);
        mSize = view.findViewById(R.id.list_file_size);
        // so on


    }
}
}

相应地更新适配器类。

我想知道为什么您要跳过缓存以求滑动,而不是存储在缓存中。

代码语言:javascript
运行
复制
manager.load(thumbnailPath).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.image);

更改为此,并允许滑行缓存产生的图像,而不是原始图像。

代码语言:javascript
运行
复制
manager.load(thumbnailPath).diskCacheStrategy(DiskCacheStrategy.RESULT).into(holder.image);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48016898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档