Android 在gridview中使用图像数组的应用程序速度非常慢
我有下面这个小应用程序,它可以显示一组照片。当按下/单击照片时,会打开较大的版本 从技术上讲,这是可行的。然而,在我的Android虚拟设备中速度非常慢。我还在Android Studio日志中看到这些消息弹出 我/编舞:跳过了38帧!应用程序可能也在运行 在它的主线上做了很多工作 所以我一定是做错了什么 根据下面的代码,有没有办法“修复”这个问题 谢谢Android 在gridview中使用图像数组的应用程序速度非常慢,android,Android,我有下面这个小应用程序,它可以显示一组照片。当按下/单击照片时,会打开较大的版本 从技术上讲,这是可行的。然而,在我的Android虚拟设备中速度非常慢。我还在Android Studio日志中看到这些消息弹出 我/编舞:跳过了38帧!应用程序可能也在运行 在它的主线上做了很多工作 所以我一定是做错了什么 根据下面的代码,有没有办法“修复”这个问题 谢谢 package com.zeus.miniapps.photoviewer; import android.content.Context;
package com.zeus.miniapps.photoviewer;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
public class ImageGrid extends AppCompatActivity {
Integer[] ApocImages = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4,
R.drawable.image5, R.drawable.image6, R.drawable.image7, R.drawable.image8,
R.drawable.image9, R.drawable.image10, R.drawable.image11, R.drawable.image12,
R.drawable.image13, R.drawable.image14, R.drawable.image15, R.drawable.image16};
ImageView pic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_grid);
GridView grid = findViewById(R.id.gridView);
final ImageView pic = findViewById(R.id.imgLarge);
grid.setAdapter(new ImageAdapter(this));
pic.setClickable(true);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getBaseContext( ), "Selected Image " + (position + 1), Toast.LENGTH_SHORT).show( );
pic.setVisibility(View.VISIBLE);
pic.setImageResource(ApocImages[position]);
}
});
pic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pic.setVisibility(View.INVISIBLE);
}
});
}
public class ImageAdapter extends BaseAdapter {
private Context context;
public ImageAdapter(Context c) {
context = c;
}
public int getCount() {
return ApocImages.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View contentView, ViewGroup parent) {
pic = new ImageView(context);
pic.setImageResource(ApocImages[position]);
pic.setScaleType(ImageView.ScaleType.FIT_XY);
pic.setLayoutParams(new GridView.LayoutParams(330, 300));
return pic;
}
}
}
package com.zeus.miniapps.photoviewer;
导入android.content.Context;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.BaseAdapter;
导入android.widget.GridView;
导入android.widget.ImageView;
导入android.widget.Toast;
公共类ImageGrid扩展了AppCompatActivity{
整数[]ApocImages={R.drawable.image1,R.drawable.image2,R.drawable.image3,R.drawable.image4,
R.drawable.image5,R.drawable.image6,R.drawable.image7,R.drawable.image8,
R.drawable.image9,R.drawable.image10,R.drawable.image11,R.drawable.image12,
R.drawable.image13,R.drawable.image14,R.drawable.image15,R.drawable.image16};
图像视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u image\u grid);
GridView grid=findViewById(R.id.GridView);
最终图像视图pic=findViewById(R.id.imgLarge);
setAdapter(新的ImageAdapter(this));
图.可点击设置(真);
grid.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Toast.makeText(getBaseContext(),“选定图像”+(位置+1),Toast.LENGTH\u SHORT.show();
pic.setVisibility(视图可见);
pic.setImageResource(ApocImages[位置]);
}
});
pic.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
图.设置可见性(视图.不可见);
}
});
}
公共类ImageAdapter扩展了BaseAdapter{
私人语境;
公共图像适配器(上下文c){
上下文=c;
}
public int getCount(){
返回ApocImages.length;
}
公共对象getItem(int位置){
返回null;
}
公共长getItemId(int位置){
返回0;
}
公共视图getView(int位置、视图contentView、视图组父级){
pic=新图像视图(上下文);
pic.setImageResource(ApocImages[位置]);
pic.setScaleType(ImageView.ScaleType.FIT_XY);
pic.setLayoutParams(新GridView.LayoutParams(330300));
返回pic;
}
}
}
下面是这个很棒的应用程序的屏幕截图
您是否在gridview中加载所有完整大小的图像?如果是的话,这可能就是问题所在,在某个时候,你甚至可能会从记忆中得到一些东西。也可能是因为您的虚拟设备没有足够的ram,请在设备上试用。关于第一个问题,您可能希望创建图像的缩略图,以便在gridview中显示,并且仅当用户点击照片时才显示fullres。 这些只是假设,无法确定。您可以尝试在gridview中显示一个具有低分辨率图像的列表,并查看它是否变得不那么滞后。如果是这样,那是因为你的图像太大,占用了太多的内存。
我知道我解释得很糟糕,如果有什么你不明白的,请告诉我。在gridview中使用图像之前,请先优化图像,你也可以使用图像缩略图。你的适配器效率很低,因为你没有遵循推荐的视图保持器模式。例如,当您滚动时,您从不重用视图,并且不断创建大量
ImageView
对象。仅修复此问题可能已经解决了问题。以下是更多信息:当您加载全尺寸图像时。它会消耗大量的内存。最好使用Glide
。它将为您的视图自动调整图像大小,并将缓存图像以供下次加载。试试看!它们是全尺寸的,但最大的只有大约300KB。所有图像的总和为2.5 MB。我检查了虚拟设备上的可用ram,它是1.5 GBs。谢谢