如何像 instagram 一样快速加载图像

Posted

技术标签:

【中文标题】如何像 instagram 一样快速加载图像【英文标题】:How to load images fast like instagram 【发布时间】:2021-07-09 05:31:19 【问题描述】:

我正在尝试将图像从 firebase 加载到回收站视图中,但问题是速度很慢,我想知道如何才能达到 Instagram 加载图像的速度,请任何人帮助我

这是我如何将图像从 firebase 加载到回收站视图的代码

Java 文件

public class Search_Fragment extends Fragment 
    public List<Upload> mUploads;
    PostAdapter postsAdapter;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
        View view = inflater.inflate(R.layout.fragment_search, container, false);
        RecyclerView postRecyclerView = view.findViewById(R.id.postRecyclerView);
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("uploads");
        postRecyclerView.setLayoutManager(
                new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
        );
        mUploads = new ArrayList<>();
        postsAdapter = new PostAdapter(getContext(), mUploads);
        postRecyclerView.setAdapter(postsAdapter);

        //This are images that i tried manual ly and it worked fine
//        List<PostItem> postItems = new ArrayList<>();
//        postItems.add(new PostItem(R.drawable.image1));
//        postItems.add(new PostItem(R.drawable.image2));
//        postItems.add(new PostItem(R.drawable.image3));
//        postItems.add(new PostItem(R.drawable.image4));
//        postItems.add(new PostItem(R.drawable.image5));
//        postItems.add(new PostItem(R.drawable.image7));
        databaseReference.addValueEventListener(new ValueEventListener() 
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) 

                    for (DataSnapshot dataSnapshot : snapshot.getChildren()) 
                        Upload upload = dataSnapshot.getValue(Upload.class);
                        mUploads.add(upload);

                
                //notify the adapter
                postsAdapter.notifyDataSetChanged();
            

            @Override
            public void onCancelled(@NonNull DatabaseError error) 
            
        );
        return view;
    

**PostAdapter.java -:**appter 类

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> 
    public static List<Upload> mUploads;
    Context mcontext;


    public PostAdapter(Context context, List<Upload> uploads) 
        mUploads = uploads;
        mcontext = context;
    


    @NonNull
    @Override
    public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
        View view;
        view = LayoutInflater.from(mcontext).inflate(R.layout.post_item_container, parent, false);
        return new PostViewHolder(view);
    

    @Override
    public void onBindViewHolder(@NonNull PostViewHolder holder, int position) 
        Upload uploadCurrent = mUploads.get(position);
        Glide.with(mcontext)
                .load(uploadCurrent.getmImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .preload();
        Glide.with(mcontext)
                .load(uploadCurrent.getmImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                .into(holder.imageView);


    

    @Override
    public int getItemCount() 
        return mUploads.size();
    

    public static class PostViewHolder extends RecyclerView.ViewHolder 
        ShapeableImageView imageView;

        PostViewHolder(@NonNull View itemView) 
            super(itemView);
            imageView = itemView.findViewById(R.id.imagePost);
        

    

Upload.java -: 我存储图像 URL 的模型类

public class Upload 
    private String mImageUrl;


    public Upload() 

    

    public Upload(String imageUrl) 
        mImageUrl = imageUrl;
    

    public String getmImageUrl() 
        return mImageUrl;
    

    public void setmImageUrl(String mImageUrl) 
        this.mImageUrl = mImageUrl;
    

【问题讨论】:

【参考方案1】:

图像需要时间来加载,因为它们的大小。有 2 个选项可以快速加载图像。

    调整图像大小。 创建缩略图。

对于调整大小,您可以使用 Glide 覆盖方法:

GlideApp  
    .with(context)
    .load(url)
    .placeholder(new ColorDrawable(Color.GREY))
    .override(400, 400) // resizes the image to these dimensions (in pixel). resize does not respect aspect ratio
    .into(imageViewResize);

对于缩略图,您必须创建较小尺寸的图像,然后在您的应用中使用它。

【讨论】:

你能解释一下我没听说过的缩略图过程吗 缩略图是我们调整为更小的尺寸并上传到我们的服务器上的那些图像。我们在列表的情况下显示缩略图,当用户点击该图像时,我们在详细屏幕中显示真实图像。 顺便说一句,您也可以使用第一个选项。 你能告诉我如何在这里使用延迟加载 使用jetpack分页库【参考方案2】:

简单的答案,使用分页概念更快地将数据加载到 RV。一个错误的错误是将所有图像(数据)一次加载到 RV。示例一次加载 15 个数据块使其加载速度更快。另一个概念使用一些加载指示器(例如闪光效果布局、微调器、加载文本等)让用户知道数据正在加载,因此他一直在等待。

从互联网加载数据时分页非常重要

【讨论】:

以上是关于如何像 instagram 一样快速加载图像的主要内容,如果未能解决你的问题,请参考以下文章

当我们上传图像时,是不是有任何反应原生包可以像 instagram 一样自动裁剪图像?

如何使用单个 UITableView 设计像 instagram 一样的时间线?

如何在所有设备中快速布局每行三个图像

像Instagram这样的图像滑块?

如何制作像 Instagram 一样的导航栏

如何像 instagram 一样实现模态向下滑动?