Android 网格视图滚动和图像加载速度非常慢

Android 网格视图滚动和图像加载速度非常慢,android,gridview,view,scroll,grid,Android,Gridview,View,Scroll,Grid,我正在使用下面的代码用图像填充网格视图,网格视图中的图像加载速度很慢,网格视图滚动速度很慢,并且在某个点被卡住。我不确定我做错了什么 logcat中未写入任何错误消息 package com.dbprox.tagpic; 导入android.content.Context; 导入android.graphics.Bitmap; 导入android.graphics.BitmapFactory; 导入android.os.Bundle; 导入android.os.Environment; 导入a

我正在使用下面的代码用图像填充网格视图,网格视图中的图像加载速度很慢,网格视图滚动速度很慢,并且在某个点被卡住。我不确定我做错了什么

logcat中未写入任何错误消息

package com.dbprox.tagpic;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.os.Bundle;
导入android.os.Environment;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.GridView;
导入android.widget.ImageView;
导入java.io.File;
导入java.util.ArrayList;
公共类imagegallery扩展了AppCompative活动{
私有类ImageAdapter扩展了BaseAdapter{
私有上下文;
ArrayList itemList=新建ArrayList();
公共图像适配器(上下文c){
mContext=c;
}
无效添加(字符串路径){
itemList.add(路径);
}
@凌驾
public int getCount(){
返回itemList.size();
}
@凌驾
公共对象getItem(int arg0){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
图像视图图像视图;
如果(convertView==null){//如果它没有被回收,初始化一些属性
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(185185));
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
设置填充(5,5,5,5);
}否则{
imageView=(imageView)convertView;
}
位图bm=decodeSampledBitmapFromUri(itemList.get(位置),185185);
如果(bm!=null){
设置图像位图(bm);
}
返回图像视图;
}
公共位图解码SampleDbitMapFromUri(字符串路径、int-reqWidth、int-reqHeight){
位图bm=null;
//使用INJUSTDECBOUNDS首次解码=true检查尺寸
final BitmapFactory.Options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
解码文件(路径、选项);
//计算样本大小
options.inSampleSize=计算样本大小(options、reqWidth、reqHeight);
//使用inSampleSize集合解码位图
options.inJustDecodeBounds=false;
bm=BitmapFactory.decodeFile(路径、选项);
返回bm;
}
公共整数计算示例大小(
BitmapFactory.Options选项、int reqWidth、int reqHeight){
//图像的原始高度和宽度
最终内部高度=options.outHeight;
最终整数宽度=options.outWidth;
int inSampleSize=1;
如果(高度>要求高度| |宽度>要求宽度){
如果(宽度>高度){
inSampleSize=数学圆((浮动)高度/(浮动)要求高度);
}否则{
inSampleSize=数学圆((浮动)宽度/(浮动)宽度);
}
}
返回样本大小;
}
}
ImageAdapter myImageAdapter;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_imagegallery);
GridView GridView=(GridView)findViewById(R.id.imagegridview);
gridview.setFastScrollEnabled(true);
myImageAdapter=新的ImageAdapter(此);
setAdapter(myImageAdapter);
字符串ExternalStorageDirectoryPath=环境
.getExternalStorageDirectory()
.getAbsolutePath();
字符串targetPath=Environment.getExternalStorageDirectory().toString()+“/Pictures”;//ExternalStorageDirectoryPath+“/Pictures”;
//Toast.makeText(getApplicationContext(),targetPath,Toast.LENGTH_LONG).show();
文件targetDirector=新文件(targetPath);
File[]files=targetDirector.listFiles();
用于(文件:文件){
试一试{
添加(file.getAbsolutePath());
}捕获(例外e){
Log.d(“标记”,“错误为”+e);}
}
}

}
我也有同样的问题。使用加载您的图像,应用程序将比以前运行得更流畅。适用于从服务器获取的图像以及可绘制资源。

您正在执行的所有与图像相关的操作都是在阻止UI的主线程上完成的。您需要将所有这些工作推送到工作线程


或者使用Glide或Picasso等库为您完成所有繁重的工作。

decodeSampledBitmapFromUri
在主线程上运行。这将导致性能问题。在另一个线程上运行它。我尝试使用毕加索加载位图图像,但如果(bm!=null){//imageView.setImageBitmap(bm);picasso.with(this.mContext).load(itemList.get(position)).resize(50,50).centerCrop().into(imageView);}你能分享一个例子吗