【问题标题】:Glide Imgae loading is taking too much time in recyclerview androidGlide 图像加载在 recyclerview android 中花费了太多时间
【发布时间】:2017-09-14 07:04:22
【问题描述】:

在我的应用程序中,我实现了一个 recyclerview 小部件来显示用户图像、姓名和公司名称。我已将文本信息存储到 Realm DB 中,这些信息在启动应用程序后立即显示。但是对于图像加载,我使用的是 Glide 图像库。但问题是只要我不浏览整个recyclerview,单击按钮后图像就不会加载。因此,如果我只看到前 10 行,则单击 recyclerview 后,它会一个接一个地加载第一个图像。然后当我返回其他页面并且如果没有互联网连接时,其他图像不会加载。图像字段为空。有什么方法可以通过 glide 更快地加载图像。

我在适配器类中的代码

public class MyColleaguesAdapter extends RecyclerView.Adapter<MyColleaguesAdapter.ColleagueHolder>{

    public static String TAG = MyColleaguesAdapter.class.getSimpleName();

    protected RequestManager glideManager; //make glideManager keeping
    private List<MyColleagueModel> myColleague;


    private Context context;

    public interface ColleagueListListener {
    }

    public MyColleaguesAdapter(List<MyColleagueModel> colleagues,Context context) {
        this.context=context;
        myColleague = colleagues;
        glideManager = Glide.with(context);
    }


    // create new views (invoked by the layout manager)
    @Override
    public ColleagueHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.colleage_row,parent,false);
        return new ColleagueHolder(view);
    }
    @Override
    public void onBindViewHolder(final ColleagueHolder holder, int position) {
        app_preferences = PreferenceManager.getDefaultSharedPreferences(context);

        final MyColleagueModel currentColleague = myColleague.get(position);

        holder.colleagueName.setText(currentColleague.getName());
        holder.companyName.setText(currentColleague.getCompany());
        holder.jobTitle.setText(currentColleague.getTitle());

        holder.cardView.setCardBackgroundColor(Constant.color);



         Glide.with( holder.itemView.getContext() )
                    .load( Constants.HTTP.PHOTO_URL + currentColleague.getMail() 
  )
                    .thumbnail( 0.5f )
                    .override( 200, 200 )
                    .diskCacheStrategy( DiskCacheStrategy.ALL )
                    .into( holder.colleaguePicture );


        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent i=new Intent(context,DetailMyColleague.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("IMAGE_URL",Constants.HTTP.PHOTO_URL + currentColleague.getMail());

                context.startActivity(i);
            }
        });

    }


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

    public class ColleagueHolder extends RecyclerView.ViewHolder{

        public CardView cardView;
        public ImageView colleaguePicture;
        public TextView colleagueName;
        public TextView  companyName;
        public TextView  jobTitle;

        public ColleagueHolder(View itemView) {
            super(itemView);
            colleaguePicture= itemView.findViewById(R.id.colleague_picture);
            colleagueName= itemView.findViewById(R.id.colleague_name);
            companyName= itemView.findViewById(R.id.company_name);
            jobTitle= itemView.findViewById(R.id.job_title);
            cardView= itemView.findViewById(R.id.cardview_user);

        }
    }

在主活动中

private RecyclerView recyclerView;
private MyColleaguesAdapter adapter;
private List<MyColleagueModel> myColleagueList = new ArrayList<>();
private ColleagueController mController;
private ColleagueResApiManager mApiManager;

private Realm colleagueRealm;
private LinearLayoutManager layoutManager;

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mycolleagues_layout);
    CookieHandler.setDefault( cookieManager );

     colleagueConfigViews();

}

public void colleagueConfigViews() {
    recyclerView = this.findViewById(R.id.colleagues_recycler);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(MyColleaguesPage.this));
    recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

    colleagueRealm = Realm.getDefaultInstance();

    RealmResults<MyColleagueModel> results = colleagueRealm.where(MyColleagueModel.class).findAll( );

    for (int i = 0; i < results.size(); i++) {

        myColleagueList.add(results.get(i));
    }
    adapter = new MyColleaguesAdapter(myColleagueList,getApplicationContext());

    recyclerView.setAdapter(adapter);
}

【问题讨论】:

  • 从 url 加载图片需要一些时间,您可以使用 Placeholder 在加载时显示图片
  • 试试.override(100, 100)
  • @NileshRathod 我如何在这里使用占位符。使用这个有什么好处吗,对不起,我是android开发的新手
  • @V-rundPuro-hit 我之前尝试过这种方式,但是图像图像质量非常低
  • 你为什么使用Glide.with( holder.itemView.getContext() );两次?

标签: android android-recyclerview android-glide image-loading imageurl


【解决方案1】:

根据my above comments Glide 需要时间从 url 加载图像,您可以使用 Placeholder 在加载时显示图像

Glide.with( holder.itemView.getContext() )
                .load( Constants.HTTP.PHOTO_URL + currentColleague.getMail() )
                .thumbnail( 0.5f )
                .override( 200, 200 )
                 .placeholder(R.drawable.ic_placeholder)
                .diskCacheStrategy( DiskCacheStrategy.ALL )
                .into( holder.colleaguePicture );

【讨论】:

  • 如何在drawable文件夹中声明R.drawable.ic_placeholder
  • @tamrezh21 只需在 res/drawable 文件夹中添加您想要显示的示例图像,而不是通过 R.id.yourImageName 访问它跨度>
  • 未解决问题。还是有同样的问题
  • @tamrezh21 Glide 需要时间从 url 加载图片
  • 你能告诉我从 url 加载图像的过程会更快吗
【解决方案2】:

我不确定,但您可以在下面尝试。 我在我的应用程序中使用以下代码。没有速度问题..

public class MyRecyclerAdapter extends RecyclerView.Adapter<ColleagueHolder > {    

   protected RequestManager glideManager; //make glideManager keeping

   protected MyRecyclerAdapter(Context context ....Activity or Fragment) {
       mContext = context;
       glideManager = Glide.with((Fragment or Activity) object);
   }

   @Override
   public void onBindViewHolder(final ColleagueHolder holder, int position) {
      holder.colleagueName.setText(currentColleague.getName());
      holder.companyName.setText(currentColleague.getCompany());
      holder.jobTitle.setText(currentColleague.getTitle());
      holder.colleaguePicture.setImageResource( R.drawable.profile_image );

      glideManager
            .load(Constants.HTTP.PHOTO_URL + currentColleague.getMail() )
            .placeholder(R.drawable.myholder)
            .fitCenter()
            .override(200, 200)
            .into(holder.colleaguePicture);

     holder.cardView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {

              Intent i=new Intent(context,DetailMyColleague.class);
              i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              i.putExtra("IMAGE_URL",Constants.HTTP.PHOTO_URL + currentColleague.getMail());
              .....
              context.startActivity(i);
    }
});
   }
}

【讨论】:

  • 我在哪里可以在主要活动中编写 RequestManager 和 MyRecyclerAdapater 方法。你能解释一下吗
  • 我已经根据你的代码更新了我的代码,我在那里有活动。您能否检查并告诉我,我如何在主要活动中调用适配器,我还能做什么,对不起,我是 android 开发的新手
  • 我看到了你的更新源。而且我认为使用 recyclerView 适配器没有问题。所以我想让你检查 1. 数据加载时间 2. 使数据变小(如果数据行是 2000,使数据 20)如果数据加载是问题,你必须异步加载数据(如使用线程或 AsyncTask 或 relam 的异步数据加载)
【解决方案3】:
@Override
public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    Glide.with(context)
         .load(URL)
         .into(holder.imageView);
}

【讨论】:

  • 请添加更多关于您的答案的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 2020-08-04
  • 2017-02-15
相关资源
最近更新 更多