java - 跳过了 46 帧!应用程序可能在其主线程上做了太多工作

标签 java android for-loop android-recyclerview

我正在尝试使用 RecyclerView 并动态地将八个图像放入适配器中。我还有每个图像的标题,因此我创建了 2 个数组,并使用具有多个条件的 for 循环,我可以设置我想要的内容。它有效,但不是我想要的。事实上我进入日志:

Skipped 46 frames!  The application may be doing too much work on its main thread.

而且列表的滚动有很强的滞后性。我该如何解决?这是代码

public class ImageAdapter  extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {

    List<GridItem> mItems;
    private static WallpaperManager wallpaper;

    String[] title = {
            "Material1",
            "Material2",
            "Wallpaper1",
            "Wallpaper2",
            "Wallpaper3",
            "Wallpaper4",
            "Wallpaper5",
            "Wallpaper6",
            "Wallpaper7"
        };

    private static int[] sDrawables = { 
        R.drawable.material, 
        R.drawable.materialuno, 
        R.drawable.materialdue,
        R.drawable.materialtre,
        R.drawable.materialquattro, 
        R.drawable.materialcinque, 
        R.drawable.materialsei, 
        R.drawable.materialsette, 
        R.drawable.materialotto
        };

    public ImageAdapter() {
        super();
        mItems = new ArrayList<GridItem>();

        for (int i=0, j=0; i < title.length && j < sDrawables.length; i++, j++) {

            GridItem wallTitle = new GridItem();
            wallTitle.setName(title[i]);
            wallTitle.setThumbnail(sDrawables[j]);
            mItems.add(wallTitle);
        }

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.image_grid_layout, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int i) {
        final GridItem nature = mItems.get(i);
        viewHolder.tvspecies.setText(nature.getName());
        viewHolder.imgThumbnail.setImageResource(nature.getThumbnail());

        viewHolder.imgThumbnail.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i("CLick",nature.toString());
            }
        });
    }

    @Override
    public int getItemCount() {

        return mItems.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        public ImageView imgThumbnail;
        public TextView tvspecies;

        public ViewHolder(View itemView) {
            super(itemView);
            imgThumbnail = (ImageView)itemView.findViewById(R.id.img_thumbnail);
            tvspecies = (TextView)itemView.findViewById(R.id.tv_species);
        }
    }
}

使用整个适配器进行编辑

最佳答案

the real walls will be from web so that array of drawable will be an array of links or a json

绝对不想加载全尺寸壁纸图像以用于网格中的缩略图。这将非常慢,并且您将耗尽堆空间。

对于您的短期测试,我只需使用图形编辑器准备一些缩略图,然后使用它们。

对于下载壁纸的“for realz”应用程序,您将需要使用第三方库,例如 Picasso 或 Universal Image Loader,它们可以在后台加载图像,将其缩小采样到缩略图大小,等等。 This sample app使用 Picasso 演示 ListView(阅读 Stack Overflow 问题)。 This sample app演示 RecyclerView 与通用图像加载器(从设备上的视频中读取视频缩略图)。

关于java - 跳过了 46 帧!应用程序可能在其主线程上做了太多工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30227114/

相关文章:

android - 无法在 Android 项目中导入谷歌云端点客户端库类

java - Clientrequestfilter 与 Containerrequestfilter

java - cvc-complex-type.2.4.c : The matching wildcard is strict, 但找不到元素 'bean' 的声明 - Spring 配置问题

java - Android N Stream API 是否向后移植到较低版本?

Android:如何将一个 Activity 分为两个单独的 Activity ?

php 和 mysql while 循环

c - 程序发出蜂鸣声,即使它不包含\a 任何地方

javascript - 循环遍历多维数组以迭代javascript中的每个项目

java - 查找要在特定正则表达式中匹配的字符的索引

java - 错误 : Could not find or load main class simon. 游戏