Android中的延迟加载系列4(ImageView)

Android ImageView显示JPEG图片的常见问题与解决方案 在Android应用开发中,图片处理是基础但关键的技术环节。Bitmap作为Android系统的核心图像处理类,负责图片的加载、解码和显示。通过BitmapFactory可以解析JPEG等常见图片格式,但在实际工程实践中常遇到图片无法显示的问题。这些问题通常源于资源路径错误、内存限制或格式兼容性等技术细节。合理使用图片加载库如Glide或Picasso能有效解决内存优化和异步加载等工程难题。掌握这些技术不仅能提升应用性能,还能优化用户体验,特别是在处理高分辨率图片和适配不同屏幕密度时尤为重要。本文针对And 阅读详情


在Android应用程序的开发中,从网络或者服务器上取得图片,往往需要花费一定的时间,占用一定的用户带宽,当页面有大量的图片时,如果不采取延迟加载的方法,则客户端需要等到所有的图片都获取之后,才可以呈现完整界面,这就可能导致界面反应不流畅,影响用户体验。


图片延迟加载的原理其实非常简单,有两种思路:

第一种思路是后台启动Thread下载图片,下载完成后,通过Message Handle的方式把控制权转让给UI Thread并绘制图片。此方法的优点是比较简单,缺点是不容易封装。

第二种思路是启动异步任务AsyncTask,通过doInBackground()方法获得图片资源之后,再通过onPostExecute()方法在UI Thread中绘制取好的图片。


以上两种方式都可以很好地处理图片的延迟加载。本文通过第一种方式来处理,对图片的延迟加载进行封装,并对性能进行如下优化:

1) 图片加载的线程优先级比UI低一级,这样可以优先处理UI任务。

2) 在内存、磁盘缓存下载的应用程序图片。读取图片的顺序为 内存 -> 磁盘 -> 网络,这样可以避免下载重复的图片,节省网络流量,并且提高响应速度和性能。

3) 本地缓存的图片可能由于某种原因过期,而与服务端不一致,比如服务端更新了图片资源,这个时候本地并不知道,从而导致了图片的不一致性,这也是采取缓存技术提高性能而导致的副作用。为了解决这个问题,可以引入时间戳的概念,当时间戳发生变化之后,重新从网络上获取图片并缓存。


以下将做简要的说明。


首先建立LazyImage对象,此对象包括了图片image,图片的网络资源链接url,以及图片所对应的时间戳(从服务端获得,如果没有时间戳的固定图片,也可以不用设置)。

package com.whyonly.core.bean;

import android.graphics.Bitmap;

public abstract class LazyImage {
	
	private Bitmap image;
	private String image_url;
	private long timestamp;
	
	
	public boolean hasLoadPhoto(){
		return image==null ? false : true;
	}
	public long getTimestamp() {
		return timestamp;
	}
	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
		this.hashCode();
	}
	
	
	
	public Bitmap getImage() {
		return image;
	}
	public void setImage(Bitmap image) {
		this.image = image;
	}
	public String getImage_url() {
		return image_url;
	}
	public void setImage_url(String image_url) {
		this.image_url = image_url;
	}

	
	public String toFileName(){ //convert the url + timestamp to file name to instore to local disk
		String fileName = "";
		if(image_url!=null && image_url.indexOf("/")!=-1 ){
			fileName=image_url.substring(image_url.lastIndexOf("/")+1,image_url.length());
		}
		return  fileName+"_"+timestamp;
	}
	
	

}

建立一个下载任务

//Task for the queue
    private class PhotoToLoad
    {
        public LazyImage lazyImage;
        public ImageView imageView;
        public boolean saveDisk;
        public PhotoToLoad(LazyImage l, ImageView i, boolean s){
        	lazyImage=l; 
            imageView=i;
            saveDisk = s;
        }
    }

以及下载队列

    //stores list of photos to download
    class PhotosQueue
    {
        private Stack<PhotoToLoad> photosToLoadStack=new Stack<PhotoToLoad>();
        
        //removes all instances of this ImageView
        public void clean(ImageView image)
        {
            for(int j=0 ;j<photosToLoadStack.size();){
                if(photosToLoadStack.get(j).imageView==image)
                    photosToLoadStack.remove(j);
                else
                    ++j;
            }
        }
    }




接着建立内存缓冲类:

class MemoryCache {
    private HashMap<String, SoftReference<Bitmap>> cache=new HashMap<String, SoftReference<Bitmap>>();
    
    public Bitmap get(String id){
        if(!cache.containsKey(id))
            return null;
        SoftReference<Bitmap> ref=cache.get(id);
        return ref.get();
    }
    
    public void put(String id, Bitmap bitmap){
        cache.put(id, new SoftReference<Bitmap>(bitmap));
    }

    public void clear() {
        cache.clear();
    }
}


和本地磁盘缓冲类

class FileCache {
  
	private File cacheDir;
    
    public FileCache(Context context){
        //Find the dir to save cached images
//        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"whyonly/cache");
//        else
//            cacheDir=context.getCacheDir();
        Log.d("ImageLoader","cacheDir:"+cacheDir);
        if(!cacheDir.exists())
            cacheDir.mkdirs();
    }
    
	public File getFile(LazyImage lazyImage){   
        String filename= lazyImage.toFileName();
        File f = new File(cacheDir, filename);
        return f;
        
    }
    
    public void clear(){
        File[] files=cacheDir.listFiles();
        for(File f:files)
            f.delete();
    }

}

把图片资源显示到ImageView

//Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable
    {
        Bitmap bitmap;
        ImageView imageView;
        public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
        public void run()
        {
            if(bitmap!=null)
                imageView.setImageBitmap(bitmap);
            else
                imageView.setImageResource(defaultImageResId);
        }
    }

最后是通过线程来控制图片的下载和显示过程

    class PhotosLoaderThread extends Thread {
        public void run() {
            try {
                while(true)
                {
                    //thread waits until there are any images to load in the queue
                    if(photosQueue.photosToLoadStack.size()==0)
                        synchronized(photosQueue.photosToLoadStack){
                            photosQueue.photosToLoadStack.wait();
                        }
                    if(photosQueue.photosToLoadStack.size()!=0)
                    {
                        PhotoToLoad photoToLoad;
                        synchronized(photosQueue.photosToLoadStack){
                            photoToLoad=photosQueue.photosToLoadStack.pop();
                        }
                        Bitmap bmp=getBitmap(photoToLoad.lazyImage,photoToLoad.saveDisk);
                        memoryCache.put(photoToLoad.lazyImage.toFileName(), bmp);
                        String tag=imageViews.get(photoToLoad.imageView);
                        if(tag!=null && tag.equals(photoToLoad.lazyImage.toFileName())){
                            BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView);
                            Activity a=(Activity)photoToLoad.imageView.getContext();
                            a.runOnUiThread(bd);
                        }
                    }
                    if(Thread.interrupted())
                        break;
                }
            } catch (InterruptedException e) {
                //allow thread to exit
            }
        }
    }

完整的图片加载类如下:

package com.whyonly.core.wrapper;

import java.io.File;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.WeakHashMap;

import com.whyonly.core.bean.LazyImage;
import com.whyonly.core.util.ImageUtil;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.ImageView;

public class ImageLoader {
    
    private static final String TAG = "ImageLoader";
	private MemoryCache memoryCache;
    private FileCache fileCache;
    private Map<ImageView, String> imageViews;
    
    private PhotosLoaderThread photoLoaderThread;
    private PhotosQueue photosQueue;
    private int defaultImageResId;
    //private Context context;
    
    public ImageLoader(Context context,int defaultImageResId){
        //Make the background thead low priority. So it will not affect the UI performance
    	photoLoaderThread=new PhotosLoaderThread();
    	photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);  
    	memoryCache=new MemoryCache();
        fileCache=new FileCache(context);
        imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
        photosQueue=new PhotosQueue();
        //this.context = context;
        this.defaultImageResId = defaultImageResId;
    }
    
    public void displayImage(LazyImage lazyImage, ImageView imageView){
    	displayImage(lazyImage,imageView,true);
    }
    
    public void displayImage(LazyImage lazyImage, ImageView imageView,boolean saveDisk)
    {
        imageViews.put(imageView, lazyImage.toFileName());  
        if(lazyImage.getImage()!=null){
        	imageView.setImageBitmap(lazyImage.getImage());//get from lazy image
            //Log.d(TAG,"----LazyImage cache:"+lazyImage.toFileName());
        }else{
        	Bitmap bitmap=memoryCache.get(lazyImage.toFileName());//get from memory cache
            if(bitmap!=null){
            	lazyImage.setImage(bitmap);
                imageView.setImageBitmap(bitmap);
                //Log.d(TAG,"----MEMORY cache:"+lazyImage.toFileName());
            }else
            {
            	if(defaultImageResId>0)
                	imageView.setImageResource(defaultImageResId);
                else
                	imageView.setImageBitmap(null);
            	if(lazyImage.getImage_url() != null)
            		queuePhoto(lazyImage, imageView,saveDisk);//get from SD card or web 
            }    
        }
    }
        
    private void queuePhoto(LazyImage lazyImage, ImageView imageView,boolean saveDisk)
    {
        //This ImageView may be used for other images before. So there may be some old tasks in the queue. We need to discard them. 
        photosQueue.clean(imageView);
        PhotoToLoad photosToLoad=new PhotoToLoad(lazyImage, imageView, saveDisk);
        synchronized(photosQueue.photosToLoadStack){
            photosQueue.photosToLoadStack.push(photosToLoad);
            photosQueue.photosToLoadStack.notifyAll();
        }
        
        //start thread if it's not started yet
        if(photoLoaderThread.getState()==Thread.State.NEW)
            photoLoaderThread.start();
    }
    
    private Bitmap getBitmap(LazyImage lazyImage,boolean saveDisk) 
    {
      	if(!saveDisk){
      		return ImageUtil.returnBitMap(lazyImage.getImage_url());
      	}
    	
    	File f=fileCache.getFile(lazyImage);
        //from SD cache
        Bitmap b = ImageUtil.file2Bitmap(f);
        if(b!=null){
        	lazyImage.setImage(b);
        	//Log.d(TAG,"----FILE cache:"+lazyImage.toFileName());
            return b;
        } 
        
        //from web
        try {
            URL imageUrl = new URL(lazyImage.getImage_url());
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            InputStream is=conn.getInputStream();
            ImageUtil.inputStream2File(is, f);
            lazyImage.setImage(ImageUtil.file2Bitmap(f));
            //Log.d(TAG,"----WEB URL:"+lazyImage.toFileName());
            return lazyImage.getImage();
        } catch (Exception ex){
           //ex.printStackTrace();
           return null;
        }
    }

    
    //Task for the queue
    private class PhotoToLoad
    {
        public LazyImage lazyImage;
        public ImageView imageView;
        public boolean saveDisk;
        public PhotoToLoad(LazyImage l, ImageView i, boolean s){
        	lazyImage=l; 
            imageView=i;
            saveDisk = s;
        }
    }
    
    
    public void stopThread()
    {
        photoLoaderThread.interrupt();
    }
    
    //stores list of photos to download
    class PhotosQueue
    {
        private Stack<PhotoToLoad> photosToLoadStack=new Stack<PhotoToLoad>();
        
        //removes all instances of this ImageView
        public void clean(ImageView image)
        {
            for(int j=0 ;j<photosToLoadStack.size();){
                if(photosToLoadStack.get(j).imageView==image)
                    photosToLoadStack.remove(j);
                else
                    ++j;
            }
        }
    }
    
    class PhotosLoaderThread extends Thread {
        public void run() {
            try {
                while(true)
                {
                    //thread waits until there are any images to load in the queue
                    if(photosQueue.photosToLoadStack.size()==0)
                        synchronized(photosQueue.photosToLoadStack){
                            photosQueue.photosToLoadStack.wait();
                        }
                    if(photosQueue.photosToLoadStack.size()!=0)
                    {
                        PhotoToLoad photoToLoad;
                        synchronized(photosQueue.photosToLoadStack){
                            photoToLoad=photosQueue.photosToLoadStack.pop();
                        }
                        Bitmap bmp=getBitmap(photoToLoad.lazyImage,photoToLoad.saveDisk);
                        memoryCache.put(photoToLoad.lazyImage.toFileName(), bmp);
                        String tag=imageViews.get(photoToLoad.imageView);
                        if(tag!=null && tag.equals(photoToLoad.lazyImage.toFileName())){
                            BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad.imageView);
                            Activity a=(Activity)photoToLoad.imageView.getContext();
                            a.runOnUiThread(bd);
                        }
                    }
                    if(Thread.interrupted())
                        break;
                }
            } catch (InterruptedException e) {
                //allow thread to exit
            }
        }
    }
    
    
    
    //Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable
    {
        Bitmap bitmap;
        ImageView imageView;
        public BitmapDisplayer(Bitmap b, ImageView i){bitmap=b;imageView=i;}
        public void run()
        {
            if(bitmap!=null)
                imageView.setImageBitmap(bitmap);
            else
                imageView.setImageResource(defaultImageResId);
        }
    }

    public void clearCache() {
        memoryCache.clear();
        fileCache.clear();
    }
    
    public void clearMemoryCache() {
        memoryCache.clear();
    }

}

class MemoryCache {
    private HashMap<String, SoftReference<Bitmap>> cache=new HashMap<String, SoftReference<Bitmap>>();
    
    public Bitmap get(String id){
        if(!cache.containsKey(id))
            return null;
        SoftReference<Bitmap> ref=cache.get(id);
        return ref.get();
    }
    
    public void put(String id, Bitmap bitmap){
        cache.put(id, new SoftReference<Bitmap>(bitmap));
    }

    public void clear() {
        cache.clear();
    }
}

class FileCache {
  
	private File cacheDir;
    
    public FileCache(Context context){
        //Find the dir to save cached images
//        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"whyonly/cache");
//        else
//            cacheDir=context.getCacheDir();
        Log.d("ImageLoader","cacheDir:"+cacheDir);
        if(!cacheDir.exists())
            cacheDir.mkdirs();
    }
    
	public File getFile(LazyImage lazyImage){   
        String filename= lazyImage.toFileName();
        File f = new File(cacheDir, filename);
        return f;
        
    }
    
    public void clear(){
        File[] files=cacheDir.listFiles();
        for(File f:files)
            f.delete();
    }

}


通过 ImageLoader的包装,应用起来应该非常简单,示例代码如下:

private ImageLoader imageLoader = new ImageLoader(this,R.drawable.nohead);

imageLoader.displayImage(bean, imageView);


以上给出来图片延迟加载的基本概念,以及通过一个示例,说明了如何封装,以便应用程序可以简单地调用。下一篇将通过一个完整的工程例子,对图片的延迟加载,以及ListView的延迟加载加载进行综述。(待续)



UE5在Ubuntu22.04.4下的高效开发环境配置指南 本文详细介绍了在Ubuntu 22.04.4系统上配置UE5高效开发环境的完整指南,包括系统准备、显卡驱动安装、UE5引擎编译与配置、开发工具链设置以及性能优化技巧。通过逐步指导,帮助开发者快速搭建稳定的UE5开发环境,解决常见问题,提升开发效率。 阅读详情

相关推荐

精益六西格玛Python数字化应用开发-Day18 应用场景:家电企业生产效率优化

本文将重点介绍专门针对精益六西格玛黑带使用场景的 Python 库,这些库功能侧重于数据分析和流程优化,特别适用于 DMAIC 方法论和看板管理。考虑到读者具备中高级Python 使用经验,我们将深入探讨各库的高级功能和实际应用应用场景。 某家电企业生产线自动化程度高,数据量巨大,希望通过精益管理提升生产效率。企业借助 Python 脚本,打通各类数据源(MES、ERP、设备日志),自动归集生产数据,分析各工序的生产节拍、设备停机、效率损失,快速定位瓶颈环节

m0_56592100的博客 905

setImageResource和setImageBitmap详解。

在4.0.4 r1.2中查看android.widget.ImageView源代码可以发现,setImageBitmap()方法其实是调用了setImageDrawable()方法进行重绘。 Sets a Bitmap as the content of this ImageView.          Parameters:     bm The bitmap to 

棒怡情的专栏 1万+

STM32使用HAL库实现ModbusRTU主站核心要点

深入解析STM32如何利用HAL库高效实现ModbusRTU主站通信,重点讲解串口配置、定时控制与modbusrtu协议帧的构建方法,提升嵌入式通信稳定性与实时性。

weixin_42668301的博客 373

android imageview bitmap 位于底部,android-imageView.setImageBitmap(Bitmap)极大地减慢了我的应用程序...

我编写了一个小应用程序,该应用程序应显示一个转速表,该转速表通过蓝牙获取有关rpm的数据.当数据更改时,我旋转针头和其他一些imageViews以在屏幕上显示当前值.旋转代码:bMapRpm=bMapcanvasBackTacho.copy(bMapcanvasBackTacho.getConfig(), true);canvasRpm.setBitmap(bMapRpm);canvasRpm.s...

weixin_29699041的博客 268

智能车‘大脑’的诞生:揭秘电磁循迹代码背后的控制论与系统思维

本文深入探讨智能车电磁循迹系统的核心架构与控制原理,揭示了其作为精密闭环系统如何通过模块化设计、信号处理、PID控制算法及电机驱动实现自主导航。重点分析了电磁信号采集与处理流程框架,为开发者提供从理论到实践的全面指南。

arduino9maker的博客 531

基于51单片机扫地机器人(全套Proteus仿真+原理图+程序+说明书)

(内含源程序代码,原理图,仿真,讲解视频,元件清单等,【精品】值得推荐!!!扫地机器人是以单片机为主控制器。通过单片机控制小车行驶、除尘、蜂鸣。扫地机器人使用双电机驱动,以提高整车运动的平稳性;在智能车进驶过程中,采用双超声波模块实现避障。

2301_76434107的博客 1894

android listview 更新延迟,关于java:Android – 将图像延迟加载到ListView中的问题

这是一种非常常见的情况:在ListView中显示必须从Internet下载的图像。现在我有一个ArrayAdapter的自定义子类,我将其用于ListView。在ArrayAdapter的getView()实现中,我生成了一个单独的线程来加载图像。加载完成后,它会查找相应的ImageView并使用ImageView.setImageDrawable()设置图像。所以我使用的解决方案与此类似:在Li...

weixin_39829574的博客 220

deap数据集的情绪检测代码环境搭建与实现

deap数据数据集很大

f的博客 4157

高效加载Bitmap(Displaying Bitmaps Efficiently)

注:看英文版的Api Guide总觉得蛋疼,现在翻译一篇比较重要的内容:Bitmap的高效加载,希望翻译过后能真正理解该篇文章的核心思想。一般来说,我们在网络上加载的图片的的尺寸都要大于手机屏幕的分辨率,而手机的内存又极其有限,所以,在安卓开发中,对图片进行高效的处理是一块很重要的环节。在安卓开发中有条不成文的规矩:遇到图片,一定要狠狠处理。高效加载BitmapBitmapFatory类提供了许多解

泥土的博客 566

普中科技ESP8266-01s模块CWJAP:3 FAIL报错?手把手教你用AT+CWSAP指令搞定WiFi配置

本文详细解析了普中科技ESP8266-01s模块常见的CWJAP:3 FAIL报错问题,并提供了通过AT+CWSAP指令正确配置WiFi的实战解决方案。文章涵盖错误根源分析、硬件连接指南、AT指令详解及高级调试技巧,帮助开发者快速解决ESP8266-01s模块的WiFi配置难题。

weixin_42653691的博客 201

还原 Windows 环境变量的默认值

有时候,我们可能需要还原环境变量的默认值,以修复可能的配置问题或恢复系统的正常运行。如果您只想还原某个特定的环境变量,可以跳过删除其他变量的步骤,仅删除需要还原的变量即可。在“环境变量”对话框中,继续向下滚动到“系统变量”部分。请注意,在执行以下步骤之前,您应该备份当前的环境变量设置,以便在需要时可以还原。在删除所有需要还原的环境变量后,点击“确定”按钮关闭“环境变量”对话框。在“用户变量”部分,选择需要还原的变量,然后点击“删除”按钮。在“高级”选项卡下方的“环境变量”部分,点击“环境变量”按钮。

PvDeveloper的博客 6341

Bitmap优化及内存优化

Android系统中Bitmap是否有调用recycle方法的必要性Bitmap需调用 recycle() 是历史问题,在 Android 3.0之前,Bitmap 的图片数据是在底层C中处理的,因此在 Android3.0 之前 recycle() 是应该调用的。虽然 finalize() 会调用 recycle() ,但对Java有经验的同学应该知道只依靠 finalize() 去释放资源是会出

路漫漫亦无涯 1438

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

Android | Android性能优化之延迟加载视图

有时候,UI的布局可能包含了复杂但又不一定使用的视图。如果只在需要的时候加载这些视图,而不是一进入页面就加载,那么我们就可以加快页面的启动速度并且减少内存的使用。Android系统提供了一个叫做ViewStub的控件来帮助我们实现延迟加载视图。

cyc的专栏 4187

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何在Android中的ListView中延迟加载图像

我正在使用ListView显示一些图像和与这些图像相关的标题。 我正在从互联网上获取图像。 有没有一种方法可以延迟加载图像,以便在显示文本时不会锁定UI并在下载图像时显示它们? 图像总数

p15097962069的博客 364

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android中的延迟加载系列5 (综合案例 含完整代码及工程下载)

本文给出Android延迟加载综合案例,描述ListView和ImageView的分页延迟加载,已经若干有用的封装技术,来结束本系列文章。 本文将在ListView延迟加载示例工程的基础上进行修改,加入图片延迟加载的功能。 在行布局中加入图片, <RelativeLayout android:id="@+android:id/iconpref" xmlns:android="htt

whyonly的专栏 2350

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android中的延迟加载系列(ListView 1)

在Java语言开发中,大家对延迟加载并不陌生,比如Hibernate开发中就大量用到了延迟加载的技术。延迟加载在Android中同样适用,其基本思想是:只有在必要的时候,才去加载数据项。 本系列文章将对Android中常用的延迟加载进行简要的总结,并给出示例代码,以帮助读者的理解。由于时间的限制,本系列文章只讲解Android中的ListView和ImageView,其它涉及的组件较为类似,因此

whyonly的专栏 3061

推荐一款强大的Android图像处理库:Android Smart ImageView

推荐一款强大的Android图像处理库:Android Smart ImageView 在Android应用开发中,处理图像往往是一项挑战,尤其是在保证性能和用户体验的同时加载大图或者网络图片。今天,我们要向您推荐一个优秀的开源项目——,它为开发者提供了更智能、高效的解决方案。 项目简介 Android Smart ImageView是由开发者 LoopJ 创建的一个Android图像视图组件,它...

gitblog_00033的博客 557

Android中实现延迟加载效果

主要是分两步实现,一是在xml布局中使用ViewStub控件,再在java代码中实现。 1) 首先,只要是要将Android页面中要进行延迟加载,那么都要将该部分布局加载到ViewStub中。 FrameLayout     android:layout_width="match_parent"     android:layout_height="360dp"     android:

若先设计 1736

Bitmap加载于imageView的一些坑

1.imageView加载的Bitmap,如果想要设置相同的大小,就是bitmap可以刚好填充好整个imageVie

jq的专栏 7674

Android布局延迟加载,Android性能优化以及数据优化方法

Android性能优化-布局优化今天,继续Android性能优化一 编码细节优化。编码细节,对于程序的运行效率也是有很多的影响的。今天这篇主题由于技术能力有限,所以也不敢在深层去和大家分享。我将这篇主题分为以下几个小节:(1)缓存(2)数据(3)延迟加载和优先加载1> 缓存在Android中缓存可以用在很多的地方:对象、IO、网络、DB等等。。对象缓存能减少内存分配,IO缓存能对磁盘的读写...

weixin_36410293的博客 795

Android之viewstub用法详解及实现延迟加载

转载地址:http://blog.youkuaiyun.com/jason0539/article/details/26132267  ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View " 需要注意的是,加载view之后,viewstub本身就会被新加载进来的view替换掉 上代码了,看完就理解了

591

js库 延迟加载_用于延迟图像加载的4个最佳Android库

js库 延迟加载 图像驱动用户体验。 人们被认为是高度视觉化的生物。 这就是为什么根据阿尔伯特·梅拉比安(Albert Mehrabian)的7-38-55个人交流规则,面对面交流通常分为三个要素:7%的口语,38%的语音和语气以及55%的肢体语言。 我们主要通过视力感知世界,而从其他感官中获取的信号却更少。 随着整个全球经济继续对其产品和服务进行数字化,以及消费者在生活中采用更多技术,图...

202
上一篇: Android中的延迟加载系列(ListView 3 含完整代码及工程下载)
下一篇: Android中的延迟加载系列5 (综合案例 含完整代码及工程下载)
丁子
博客等级 码龄24年 64粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值