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

时间:2015-05-13 23:57:05

标签: 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);
        }
    }
}

使用整个适配器编辑

2 个答案:

答案 0 :(得分:2)

  

真正的墙将来自网络,以便drawable数组将是一个链接数组或一个json

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

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

对于你的&#34;对于realz&#34;在下载壁纸的应用程序中,您将需要使用第二方库,如Picasso或Universal Image Loader,它们可以在后台加载图像,将其缩小为缩略图大小,等等。 This sample app向Picasso演示ListView(阅读Stack Overflow问题)。 This sample app使用Universal Image Loader演示RecyclerView(从设备上的视频中读取视频缩略图)。

答案 1 :(得分:0)

我使用RecyclerView遇到了相同的问题/错误消息,延迟时间很长。我读了关于线程优化,适配器优化等的不同答案。

最后在追查问题开始时,我发现TextView中的这个Xml是罪魁祸首

            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="textMultiLine"
            android:maxLength="300"
            android:maxLines="5"

删除所有这些,只使用宽度和高度的标准值,我的问题已解决