低FPS与ListView中的图像

时间:2015-11-12 17:46:31

标签: android image listview scrollview frame-rate

我正在为我的大学餐厅制作应用程序。

我的ScrollView里面有2个ListView(一个用于第一道菜,另一个用于第二道菜)。

我使用下一个代码创建ListView:

ListView lista = (ListView)view.findViewById(R.id.listaprimero); //first dishes
ArrayList<Plato> arraydir = new ArrayList<Plato>(); //array for first dishes

ListView listaS = (ListView)view.findViewById(R.id.listasegundo); //second dishes
ArrayList<Plato> arraydirS = new ArrayList<Plato>(); //array for second dishes

Plato plato; //Object "dish"

//Now for each dish that I want to add, I use the object "Plato" 
//to create a dish with its photo and its name.
//Then I add it to the ArrayList

plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Macarrones", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.arroz), "Arroz tres delicias", "CEO");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.ternera), "Ternera", "Amenizador");
arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.pollo), "Filetitos de pollo", "Directora RRHH");
arraydirS.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.merluza), "Merluza al horno", "Directora RRHH");
arraydirS.add(plato);

// I create the Adapter for the dishes
AdapterPlatos adapter = new AdapterPlatos(getActivity(), arraydir);
AdapterPlatos adapterS = new AdapterPlatos(getActivity(), arraydirS);

// Set it
lista.setAdapter(adapter);
listaS.setAdapter(adapterS); 

现在,当我运行应用程序时,我的FPS非常低,Android Studio控制台每次都会说: &#34;跳过32帧!应用程序可能在其主线程上做了太多工作。&#34;

但是当我创造这样的菜肴时:

plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 1", "Amenizador");
    arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 2", "Amenizador");
    arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 3", "Amenizador");
    arraydir.add(plato);
plato = new Plato(getResources().getDrawable(R.drawable.macarrones), "Dish 4", "Amenizador");
    arraydirS.add(plato);
...

使用相同的照片,不会出现任何问题。

PD:照片大小在70到200Kb之间,而不是重文件。

为什么?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

解码并将Drawable(位图)加载到内存中以显示它仍然需要时间。

如果您的startService()对象仅保留在drawable的资源ID上,而不是drawable本身,那会更好。这将使用更少的内存。然后在您的适配器Plato中,您可以使用Glide之类的内容将该资源加载到getView()

ImageView

答案 1 :(得分:0)

确保图像尺寸适合容器。动态调整图像大小在计算上是昂贵的,并导致应用程序性能降低;特别是当它涉及ListViews时。

如果您从服务器获取图像,或者您支持不同的显示大小,您可能会考虑使用后台线程来首先调整它们的大小,然后使用调整大小的而不是原始的(需要在在分配给视图时飞行。)