Android 通用图像加载器显示来自SD卡的图像
我的目标是在平滑列表中显示来自SD卡的图像(缩略图),因此我编辑了演示示例(将图像从web加载到gridview),从SD卡加载图像以查看性能,当图像未缓存时(第一次),速度非常慢,因为它应该从本地SD卡而不是web加载图像,但是在缓存图像后,我对结果非常满意,请看一看,让我知道我是否做错了什么,或者我如何在第一次加载时提高性能,同时我还为其他可能更专门从SD卡加载图像的库开放,下面是代码:-Android 通用图像加载器显示来自SD卡的图像,android,universal-image-loader,Android,Universal Image Loader,我的目标是在平滑列表中显示来自SD卡的图像(缩略图),因此我编辑了演示示例(将图像从web加载到gridview),从SD卡加载图像以查看性能,当图像未缓存时(第一次),速度非常慢,因为它应该从本地SD卡而不是web加载图像,但是在缓存图像后,我对结果非常满意,请看一看,让我知道我是否做错了什么,或者我如何在第一次加载时提高性能,同时我还为其他可能更专门从SD卡加载图像的库开放,下面是代码:- public class ImageGridActivity extends AbsListViewB
public class ImageGridActivity extends AbsListViewBaseActivity {
// get files path in camera folder
public String[] getimages() {
String[] images=new String[175];
String path="file:///mnt/sdcard/DCIM/Camera/";
int counter=0;
String name;
File sdCardRoot = Environment.getExternalStorageDirectory();
File yourDir = new File(sdCardRoot, "dcim/camera");
for (File f : yourDir.listFiles()) {
if (f.isFile()){
name = path + f.getName().toString() ;
images[counter]=name;
// make something with the name
counter++;}
}
return images;
}
String[] imageUrls= getimages();
DisplayImageOptions options;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_image_grid);
Bundle bundle = getIntent().getExtras();
// imageUrls = bundle.getStringArray(Extra.IMAGES);
// imageUrls[0]="file:///mnt/sdcard/DCIM/Camera/abc.jpg";
options = new DisplayImageOptions.Builder()
/* .showStubImage(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisc(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build(); */
.showStubImage(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.showImageOnFail(R.drawable.ic_launcher).cacheInMemory()
.cacheOnDisc().bitmapConfig(Bitmap.Config.RGB_565).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
getApplicationContext()).discCacheExtraOptions(720 , 1280 , CompressFormat.PNG, 0, null).build();
ImageLoader.getInstance().init(config);
listView = (GridView) findViewById(R.id.gridview);
((GridView) listView).setAdapter(new ImageAdapter());
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startImagePagerActivity(position);
}
});
}
private void startImagePagerActivity(int position) {
Intent intent = new Intent(this, ImagePagerActivity.class);
intent.putExtra(Extra.IMAGES, imageUrls);
intent.putExtra(Extra.IMAGE_POSITION, position);
startActivity(intent);
}
public class ImageAdapter extends BaseAdapter {
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if (convertView == null) {
imageView = (ImageView) getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
} else {
imageView = (ImageView) convertView;
}
imageLoader.displayImage(imageUrls[position], imageView, options);
return imageView;
}
}
}
公共类ImageGridActivity扩展了AbsListViewBaseActivity{
//获取相机文件夹中的文件路径
公共字符串[]getimages(){
字符串[]图像=新字符串[175];
字符串路径=”file:///mnt/sdcard/DCIM/Camera/";
int计数器=0;
字符串名;
文件sdCardRoot=Environment.getExternalStorageDirectory();
File yourDir=新文件(sdCardRoot,“dcim/camera”);
对于(文件f:yourDir.listFiles()){
if(f.isFile()){
name=path+f.getName().toString();
图像[计数器]=名称;
//用这个名字做某事
计数器+++;}
}
返回图像;
}
字符串[]imageUrls=getimages();
显示图像选项;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_image_grid);
Bundle Bundle=getIntent().getExtras();
//imageUrls=bundle.getStringArray(Extra.IMAGES);
//imageUrls[0]=”file:///mnt/sdcard/DCIM/Camera/abc.jpg";
选项=新建DisplayImageOptions.Builder()
/*.showtubimage(R.drawable.ic_存根)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_错误)
.cacheInMemory(真)
.cacheOnDisc(正确)
.bitmapConfig(Bitmap.Config.RGB_565)
.build()*/
.showtubimage(R.drawable.ic_存根)
.showImageForEmptyUri(R.drawable.ic_empty)
.imageScaleType(imageScaleType.IN\u示例\u电源\u,共2个)
.showImageOnFail(R.drawable.ic_启动器).cacheInMemory()
.cacheOnDisc().bitmapConfig(Bitmap.Config.RGB_565).build();
ImageLoaderConfiguration配置=新建ImageLoaderConfiguration.Builder(
getApplicationContext()).discCacheExtraOptions(7201280,CompressFormat.PNG,0,null).build();
ImageLoader.getInstance().init(配置);
listView=(GridView)findViewById(R.id.GridView);
((GridView)listView).setAdapter(新的ImageAdapter());
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
StartImagePageActivity(位置);
}
});
}
私有void StartImagePageActivity(内部位置){
Intent Intent=新的Intent(这是ImagePageActivity.class);
intent.putExtra(Extra.IMAGES,imageURL);
意向。额外(额外图像位置、位置);
星触觉(意向);
}
公共类ImageAdapter扩展了BaseAdapter{
@凌驾
public int getCount(){
返回imageurl.length;
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终图像视图;
if(convertView==null){
imageView=(imageView)GetLayoutFlater()。充气(R.layout.item\u grid\u image,父项,false);
}否则{
imageView=(imageView)convertView;
}
displayImage(ImageURL[position],imageView,选项);
返回图像视图;
}
}
}
项目\网格\图像
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="120dip"
android:adjustViewBounds="true"
android:contentDescription="@string/descr_image"
android:scaleType="centerCrop" />
提前感谢您,首先,我不会在每次通过创建您的活动时初始化图像加载程序。基本上,您不需要多次初始化,因此我建议您在
应用程序onCreate
中初始化它。我不知道图像加载器将如何运作,如果你重新初始化后,它已经开始下载一些图像
除此之外,你正在做的事情对我来说似乎有点奇怪-你的手机上已经有了图像,但是你给了图像加载器一个任务,让它们再次存储,以便缓存它们。我认为你的配置中的这个参数是假的:.cacheOnDisc()
试着不用它,看看你是否能更快(删除它会阻止UIL在SD卡上复制)显示项目网格图像
代码,不要使用硬编码路径。添加的项目网格图像也可以请你解释一下你的意思吗“不要使用硬编码路径。”String path=”file:///mnt/sdcard/DCIM/Camera/“
这是硬编码的路径。请使用Environment.getExternalStorageDirectory()
谢谢,我一定会尝试删除cacheOnDisc并检查性能,我是否应该使用任何其他参数,如threedpoolsize,我是否应该使用视图保持器?@user1097275是的,您应该使用视图保持器来平滑滚动和提高性能