【问题标题】:universal image loader display images from SD card通用图像加载器显示来自 SD 卡的图像
【发布时间】:2013-07-04 19:23:56
【问题描述】:

我的目标是在平滑列表中显示来自 SD 卡的图像(缩略图),所以我稍微编辑了演示示例(从 web 加载图像到 gridview)以从 SD 卡加载图像以查看性能,以及何时图像没有缓存(第一次)它很慢,因为它应该从本地 SD 卡而不是网络加载图像,但是在图像被缓存后,我对结果非常满意,请看一下,如果我在做任何事情,请告诉我错了,或者我如何在第一次加载时提高性能,我也对其他可能更专门从 SD 卡加载图像的库开放,这里是代码:-

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;
        }
    }
}

item_grid_image

<?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" />

提前谢谢你,

【问题讨论】:

  • 向我们展示item_grid_image 代码,不要使用硬编码路径。
  • 添加了 item_grid_image
  • 您能否解释一下“不要使用硬编码路径”是什么意思。
  • String path="file:///mnt/sdcard/DCIM/Camera/" 这是硬编码路径。使用Environment.getExternalStorageDirectory()

标签: android universal-image-loader


【解决方案1】:

第一件事是我不会在每次通过您的活动的onCreate 时初始化图像加载器。基本上,您不需要多次初始化,所以我建议您在 Application onCreate 中初始化它。我不知道如果你在它已经开始下载一些图像之后重新初始化它,图像加载器会如何表现。

除此之外,您所做的事情对我来说似乎有点奇怪——您的手机上已经有了图像,但是您让图像加载器再次获取并存储它们,以便将它们缓存起来。我认为你的配置的这个参数是虚假的:.cacheOnDisc() 尝试不使用它,看看你是否能更快(删除它会阻止 UIL 在 SD 卡上重复)

【讨论】:

  • 谢谢,我一定会尝试删除 cacheOnDisc 并检查性能,我是否应该使用任何其他参数,例如threedpoolsize,我应该使用视图支架吗?
  • @user1097275 是的,您应该使用 viewholder 来实现平滑滚动和性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多