【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )(二)

简介: 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )(二)

5. 使用步骤




(1) 引入库的三种方式



引入 Universal-Image_Loader 库 : 使用以下每种方法都可以;


-- 1. 直接导入 JAR 包 : 下载地址 点击打开链接, 将 jar 包导入到 Android 工程中;


-- 2. Maven 依赖 :


<dependency>
    <groupId>com.nostra13.universalimageloader</groupId>
    <artifactId>universal-image-loader</artifactId>
    <version>1.9.5</version>
</dependency>


-- 3. Gradle 依赖 :

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'





(2) 添加网络存储权限


Manifest 配置 : 使用本 JAR 包需要添加 网络 和 内存 读写权限;


<manifest>
    <!-- Include following permission if you load images from Internet -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Include following permission if you want to cache images on SD card -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>






(3) 首次初始化 ImageLoader


初始化 : 首次使用 Universal-Image-Loader 之前需要初始化, 初始化必须在一个 Context 中进行初始化;


-- 初始化方法 : 创建一个 ImageLoaderConfiguration, 并且使用 ImageLoader.getInstance().init() 方法进行初始化;


public class MyActivity extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();
        // Create global configuration and initialize ImageLoader with this config
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
            ...
            .build();
        ImageLoader.getInstance().init(config);
        ...
    }
}


(4) 配置 ImageLoader


ImageLoader 配置简介 :


-- 配置全局性 (配置作用范围) : ImageLoader 的 配置 (ImageLoaderConfiguration) 在应用全局中有效, 你只需要设置它一次.


-- 配置可选性 : 配置中所有的选项都是可选的;


-- 默认配置 : 可以查看 ImageLoaderConfiguration.java 类, 其中的默认值即默认配置;


/** {@value} */
  public static final int DEFAULT_THREAD_POOL_SIZE = 3;
  /** {@value} */
  public static final int DEFAULT_THREAD_PRIORITY = Thread.NORM_PRIORITY - 2;
  /** {@value} */
  public static final QueueProcessingType DEFAULT_TASK_PROCESSING_TYPE = QueueProcessingType.FIFO;
  private Context context;
  private int maxImageWidthForMemoryCache = 0;
  private int maxImageHeightForMemoryCache = 0;
  private int maxImageWidthForDiskCache = 0;
  private int maxImageHeightForDiskCache = 0;
  private BitmapProcessor processorForDiskCache = null;
  private Executor taskExecutor = null;
  private Executor taskExecutorForCachedImages = null;
  private boolean customExecutor = false;
  private boolean customExecutorForCachedImages = false;
  private int threadPoolSize = DEFAULT_THREAD_POOL_SIZE;
  private int threadPriority = DEFAULT_THREAD_PRIORITY;
  private boolean denyCacheImageMultipleSizesInMemory = false;
  private QueueProcessingType tasksProcessingType = DEFAULT_TASK_PROCESSING_TYPE;
  private int memoryCacheSize = 0;
  private long diskCacheSize = 0;
  private int diskCacheFileCount = 0;
  private MemoryCache memoryCache = null;
  private DiskCache diskCache = null;
  private FileNameGenerator diskCacheFileNameGenerator = null;
  private ImageDownloader downloader = null;
  private ImageDecoder decoder;
  private DisplayImageOptions defaultDisplayImageOptions = null;
  private boolean writeLogs = false;



-- 配置示例 : 所有配置的示例.

// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
// See the sample project how to use ImageLoader correctly.
File cacheDir = StorageUtils.getCacheDirectory(context);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
        .diskCacheExtraOptions(480, 800, null)
        .taskExecutor(...)
        .taskExecutorForCachedImages(...)
        .threadPoolSize(3) // default
        .threadPriority(Thread.NORM_PRIORITY - 2) // default
        .tasksProcessingOrder(QueueProcessingType.FIFO) // default
        .denyCacheImageMultipleSizesInMemory()
        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
        .memoryCacheSize(2 * 1024 * 1024)
        .memoryCacheSizePercentage(13) // default
        .diskCache(new UnlimitedDiskCache(cacheDir)) // default
        .diskCacheSize(50 * 1024 * 1024)
        .diskCacheFileCount(100)
        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
        .imageDownloader(new BaseImageDownloader(context)) // default
        .imageDecoder(new BaseImageDecoder()) // default
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
        .writeDebugLogs()
        .build();

(5) 展示选项


展示选项简介 :


-- 作用范围 : 展示选项 (DisplayImageOptions) 只对每个展示任务 (Display Task) 有效 (ImageLoader.displayImage(...));


-- 展示任务 : 展示选项 (Display Options) 可以被应用于每个展示任务 (ImageLoader.displayImage(...) call);


-- 默认展示选项使用条件 : 如果展示选项没有通过 ImageLoader.displayImage(...) 方法设置, 那么就会使用默认的展示选项;


-- 默认展示选项来源 : 展示选项是 配置类 调用 ddefaultDisplayImageOptions() 方法获取,  如ImageLoaderConfiguration.defaultDisplayImageOptions(...) ;


-- 展示选项示例 :


// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
// See the sample project how to use ImageLoader correctly.
DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic_stub) // resource or drawable
        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
        .showImageOnFail(R.drawable.ic_error) // resource or drawable
        .resetViewBeforeLoading(false)  // default
        .delayBeforeLoading(1000)
        .cacheInMemory(false) // default
        .cacheOnDisk(false) // default
        .preProcessor(...)
        .postProcessor(...)
        .extraForDownloader(...)
        .considerExifParams(false) // default
        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
        .bitmapConfig(Bitmap.Config.ARGB_8888) // default
        .decodingOptions(...)
        .displayer(new SimpleBitmapDisplayer()) // default
        .handler(new Handler()) // default
        .build();













二. Universal-Image-Loader 示例代码







示例代码地址 : https://github.com/han1202012/Android-Quick-Develop/tree/master/app_sample_universal-image-loader








1. ListView 中使用 UIL




ListView 中使用 UIL :


-- 核心代码 : 主要是在 ListView 的适配器中使用 UIL;


-- 设置展示选项 :


  options = new DisplayImageOptions.Builder()

    .showImageOnLoading(R.drawable.ic_stub)  //设置加载时的图片

    .showImageForEmptyUri(R.drawable.ic_empty) //设置没有 Uri 地址时的图片

    .showImageOnFail(R.drawable.ic_error)  //设置加载失败时的图片

    .cacheInMemory(true)      //设置内存缓存

    .cacheOnDisk(true)       //设置硬盘缓存

    .considerExifParams(true)     //考虑相机参数

    .displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//设置加载器, 将图片切成圆形展示出来

    .build();



-- 调用核心方法展示图片 :


ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener);


-- 完整的 ListView 适配器代码 :



private static class ImageAdapter extends BaseAdapter {
  private static final String[] IMAGE_URLS = Constants.IMAGES_CN;
  private LayoutInflater inflater;
  private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
  private DisplayImageOptions options;
  ImageAdapter(Context context) {
    inflater = LayoutInflater.from(context);
    options = new DisplayImageOptions.Builder()
      .showImageOnLoading(R.drawable.ic_stub)  //设置加载时的图片
      .showImageForEmptyUri(R.drawable.ic_empty)  //设置没有 Uri 地址时的图片
      .showImageOnFail(R.drawable.ic_error)  //设置加载失败时的图片
      .cacheInMemory(true)      //设置内存缓存
      .cacheOnDisk(true)        //设置硬盘缓存
      .considerExifParams(true)     //考虑相机参数
      .displayer(new CircleBitmapDisplayer(Color.WHITE, 5))//设置加载器, 将图片切成圆形展示出来
      .build();
  }
  @Override
  public int getCount() {
    return IMAGE_URLS.length;
  }
  @Override
  public Object getItem(int position) {
    return position;
  }
  @Override
  public long getItemId(int position) {
    return position;
  }
  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    final ViewHolder holder;
    if (convertView == null) {
    view = inflater.inflate(R.layout.item_list_image, parent, false);
    holder = new ViewHolder();
    holder.text = (TextView) view.findViewById(R.id.text);
    holder.image = (ImageView) view.findViewById(R.id.image);
    view.setTag(holder);
    } else {
    holder = (ViewHolder) view.getTag();
    }
    holder.text.setText("Item " + (position + 1));
    //加载 并 显示图片
    ImageLoader.getInstance().displayImage(IMAGE_URLS[position], holder.image, options, animateFirstListener);
    return view;
  }
  static class ViewHolder {
    TextView text;
    ImageView image;
  }
  }




-- 效果图 :


image.png






目录
相关文章
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
2265 11
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
825 27
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
525 15
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
899 9
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
1320 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
886 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。

推荐镜像

更多