`
liuweisir
  • 浏览: 43371 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用Java concurrent编写异步加载图片功能

阅读更多

android异步加载ListView中的图片中使用异步方式加载的图片,当时要的急,写的很粗糙,是为每个图片加载一个线程来实现的。

可以用java concurrent很简明的实现类似功能,并且用到线程池。

这里加载的图片,都是从网上直接获取的。如果用android的UI线程,则需要图片全部加载后才能显示界面。

这里使用了concurrent api通过后台线程并发获取,本例中线程池中只有一个线程,可以设置为多个以加快加载速度。可参见使用java concurrent处理并发需求中的简单示例了解concurrent api的基本机制。

代码不复杂:

package com.easymorse.lazyload; 

import java.net.URL; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.ImageView; 

public class LazyLoadImageActivity extends Activity { 

    private ExecutorService executorService = Executors.newFixedThreadPool(1); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        loadImage("http://www.chinatelecom.com.cn/images/logo_new.gif", R.id.image1); 
        loadImage("http://www.baidu.com/img/baidu_logo.gif", R.id.image2); 
        loadImage("http://cache.soso.com/30d/img/web/logo.gif", R.id.image3); 
    } 

    @Override 
    protected void onDestroy() { 
        executorService.shutdown(); 
        super.onDestroy(); 
    } 

    private void loadImage(final String url, final int id) { 
        final Handler handler=new Handler(); 
        executorService.submit(new Runnable() { 
            @Override 
            public void run() { 
                try { 
                    final Drawable drawable = Drawable.createFromStream( 
                            new URL(url).openStream(), "image.png"); 
                    handler.post(new Runnable() { 

                        @Override 
                        public void run() { 
                            ((ImageView) LazyLoadImageActivity.this 
                                    .findViewById(id)) 
                                    .setImageDrawable(drawable); 
                        } 
                    }); 
                } catch (Exception e) { 
                    throw new RuntimeException(e); 
                } 
            } 
        }); 
    } 
}

 

完整源代码见:

http://easymorse.googlecode.com/svn/tags/lazy.load.image-0.2.0/

可以对比一下不做异步处理的示例:

http://easymorse.googlecode.com/svn/tags/lazy.load.image-0.1.0/

分享到:
评论

相关推荐

    Java下载器 用 Java 编写的URL下载器 workspace

    【Java下载器 用 Java 编写的URL下载器 workspace】是一个项目,主要目的是实现一个基于Java编程语言的URL资源下载工具。这个项目的工作空间包含了相关的源代码和可能的配置文件,便于开发者理解和学习如何利用Java...

    java语言编写的类似于迅雷的下载器的源代码,

    本项目是用Java语言编写的一款类似于迅雷的下载器的源代码,旨在实现高效的多线程下载功能,以及实时的下载进度和流量显示,这对于学习和理解网络下载管理软件的开发具有很高的参考价值。 首先,让我们了解一下这个...

    Android异步加载图像小结 (含线程池,缓存方法).rar

    在Android开发中,异步加载图像是一项至关重要的技术,它能确保用户界面的流畅性,避免因图片加载导致的应用程序卡顿。本资料主要聚焦于如何有效地实现这一目标,包括利用线程池和缓存策略来优化图像加载过程。下面...

    java 批量上传图片

    综上所述,实现“java 批量上传图片”涉及到了Java I/O、多线程、网络通信、文件处理、异常处理等多个方面,开发者需要对这些知识点有深入理解和实践,才能编写出稳定、高效的批量图片上传程序。

    歌曲下载,用java写的哦

    综上所述,开发一个用Java编写的歌曲下载程序涉及网络通信、文件I/O、异常处理、多线程以及可能的UI设计等多个方面。通过对这些技术的运用,你可以创建一个实用且功能完备的程序,让使用者方便地下载喜欢的音乐。

    java api1.6、1.7

    Java API 1.6 和 1.7 是Java开发的关键组成部分,它们包含了Java标准库的详细文档,这些库是编写Java应用程序和服务器端程序的基础。这两个版本在Java发展历程中占据了重要地位,引入了许多新特性,优化了性能,并...

    用java语言实现的Web浏览器

    10. **资源管理**:浏览器可能需要加载图片和其他外部资源,这涉及到I/O流的操作,如`java.io.FileInputStream`和`java.nio.file.Files`。 通过以上技术的组合运用,我们可以构建一个功能完备的Java Web浏览器。这...

    JAVA JDK1.6 API中文帮助文档

    5. **NIO.2**:新I/O(New I/O)API在1.6版本中进一步完善,提供了文件系统操作、异步I/O等功能,增强了I/O性能。 6. **脚本引擎支持**:JDK1.6开始支持JavaScript和其他脚本语言,通过JSR 223规范,可以在Java程序...

    java.util.concurrent介绍(重要).pdf

    使用这些类和接口,开发者可以编写更加高效、可扩展和易于理解的并发代码,减少对低级同步原语(如 `synchronized` 和 `wait()`/`notify()`)的依赖,提高代码的可读性和正确性。此外,`java.util.concurrent` 包的...

    JAVA上传下载源代码

    在Java编程语言中,上传和下载功能是网络应用的核心部分,尤其在开发Web服务、文件管理系统或者云存储平台时。本资源提供了JAVA实现的上传和下载源代码,这对于理解和实践相关技术至关重要。以下是对这些源代码可能...

    Java下载文件小工具

    【Java下载文件小工具】是一款由个人开发者设计并编写的实用程序,主要功能是协助用户进行文件的下载操作。这款小工具特别适合Java初学者学习和参考,从中可以了解到Java编程语言在实现文件下载功能时的技术和思路。...

    Java8 英文文档 API .zip

    Java 8是Java平台的重大更新,引入了许多新特性,增强了语言功能,并且对标准库进行了大量改进。这个“Java8英文文档API .zip”包含了Java 8的官方API文档,对于学习和理解Java 8的新特性和编程模式至关重要。下面...

    concurrent.rar

    下载`concurrent.rar`文件,你将有机会学习到这些关键概念的实际示例和使用方法,进一步加深对Java并发编程的理解。通过深入研究,你可以编写出更加高效、安全的多线程程序,提升你的Java编程技能。

    java高级教程JAVA高级教程

    **并发编程**:Java并发库(java.util.concurrent)包含了许多高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`CountDownLatch`(倒计时器)和`Future`接口等,这些工具帮助开发者编写高效、...

    JAVA6源代码

    Java的设计目标是实现“一次编写,到处运行”,这在20世纪90年代末期,随着网络的普及和分布式计算的发展,成为了编程界的迫切需求。本资料包中的“Java 6程序设计实践教程源代码”提供了对这一版本Java编程的深入...

    java api大集合

    4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了线程相关的类和接口,支持并发编程。 5. **异常处理**:`java.lang.Throwable`及子类定义了异常处理机制,如`Exception`、`Error`等。 二、高级...

    用java写的一个简单web浏览器

    6. **线程管理**:考虑到网络请求通常需要异步执行以避免阻塞UI,开发者可能使用了`java.lang.Thread`或`java.util.concurrent`包中的类来处理并发。这样,网络请求可以在后台线程中进行,同时保持用户界面的响应性...

    JAVA5/JAVA6新特性

    引入了文件系统API,支持异步I/O操作,增加了文件通道、文件属性和文件事件等功能。 #### 11. **动态语言支持(Dynamic Language Support)** Java 6增强了对动态语言的支持,如JRuby、Jython等,通过JSR 223和JSR ...

    java 1.7 官方中文

    通过阅读这个中文版的API文档,开发者可以更好地掌握Java 1.7的特性和使用方法,编写出高效、稳定且易于维护的代码。无论你是初学者还是经验丰富的开发者,这份资料都将是你不可或缺的开发伙伴。

    Java虚拟机规范(Java SE 7)(中英文版)

    Java SE 7(Java Standard Edition 7)是Java平台的一个重要版本,引入了许多新特性和改进,使得开发者能够编写更加高效和可靠的程序。本篇文章将详细探讨Java虚拟机规范在Java SE 7中的主要内容。 1. 类加载机制:...

Global site tag (gtag.js) - Google Analytics