Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在gridview中使用图像数组的应用程序速度非常慢_Android - Fatal编程技术网

Android 在gridview中使用图像数组的应用程序速度非常慢

Android 在gridview中使用图像数组的应用程序速度非常慢,android,Android,我有下面这个小应用程序,它可以显示一组照片。当按下/单击照片时,会打开较大的版本 从技术上讲,这是可行的。然而,在我的Android虚拟设备中速度非常慢。我还在Android Studio日志中看到这些消息弹出 我/编舞:跳过了38帧!应用程序可能也在运行 在它的主线上做了很多工作 所以我一定是做错了什么 根据下面的代码,有没有办法“修复”这个问题 谢谢 package com.zeus.miniapps.photoviewer; import android.content.Context;

我有下面这个小应用程序,它可以显示一组照片。当按下/单击照片时,会打开较大的版本

从技术上讲,这是可行的。然而,在我的Android虚拟设备中速度非常慢。我还在Android Studio日志中看到这些消息弹出

我/编舞:跳过了38帧!应用程序可能也在运行 在它的主线上做了很多工作

所以我一定是做错了什么

根据下面的代码,有没有办法“修复”这个问题

谢谢

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。谢谢