0

Ich verwende Glide in einem Cursor-Adapter, um Tausende von Ansichten zu laden. Sie alle haben ein kleines Bild an sie von der Festplatte (alle weniger als 10kb) geladen. Allerdings werde ich eiskalt und das Problem scheint von der Glide-Bibliothek zu kommen (allerdings könnte es an dem Cursorloader liegen). Ich habe meinen Code und meine Log-Dateien unten angehängt.RecyclerView Einfrieren mit Glide

Relevante Adapter Cursor-Code:

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); 
      } 
     } 
    } 

Logs:

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 
+0

bieten vollständige Recyclerview-Klasse. – Aks4125

+0

Das Listview friert die App tatsächlich ein, wenn Glide in Adapterlayouts verwendet wird. Verwenden Sie stattdessen Recyclerview. – AloDev

+0

@ Aks4125 ist es nicht eine benutzerdefinierte RecyclerView Klasse –

Antwort

0

Wie diskutiert ..

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 


    } 
} 
} 

Aktualisieren Sie Ihre Adapterklasse entsprechend.


Ich frage mich, warum Sie Cache zum Gleiten überspringen und nicht im Cache speichern.

manager.load(thumbnailPath).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.image); 

Ändern Sie dies und ermöglichen Sie gleiten, um das resultierende Bild nicht das Original zu Cache.

manager.load(thumbnailPath).diskCacheStrategy(DiskCacheStrategy.RESULT).into(holder.image); 
+0

Dank dieser stark reduziert die Verzögerung, die technisch diese Frage beantwortet. Muss eine neue Frage für den zu vielen Dateien Fehler öffnen. –

+0

@DreamersOrg ja .. senden Sie mir Link, wenn möglich – Aks4125