使用java concurrent处理异步加载图片功能

Android异步加载网络图片 / 调用callback对象的loadImage方法,并将图片路径和图片回传给adapter@Override// 当队列中还有未处理的任务时,执行下载任务// 获取第一个任务,并将之从任务队列中删除// 将下载的图片添加到缓存if(handler!= null){// 创建消息对象,并将完成的任务添加到消息对象中// 发送消息回主线程//如果队列为空,则令线程等待try {//回调接口// 下载任务的下载路径// 下载的图片// 回调对象。 阅读详情

转载:http://marshal.easymorse.com/archives/3081

java5开始,增加了concurrent api,用于并发处理。比如起多个线程并发从网络上下载图片,然后在本地显示。

这里写个简单的代码,来说明如何使用concurrent api提供的线程连接池。

运行结果类似这样:

start do 1 task … 
>>main thread end. 
start do 2 task … 
start do 1 finished. 
start do 3 task … 
start do 2 finished. 
start do 3 finished.

这里的task1到task3,都做的同样的事情,让它所属的线程休眠2000ms:

private static void doSomething(int id) { 
    System.out.println("start do " + id + " task …"); 
    try { 
        Thread.sleep(1000 * 2); 
    } catch (InterruptedException e) { 
        e.printStackTrace(); 
    } 
    System.out.println("start do " + id + " finished."); 
}

 

如果没有java自带的这个api,需要自己或者使用不标准的第三方线程池api。用concurrent api写起来很简洁:

public static void main(String[] args) { 

    ExecutorService executorService = Executors.newFixedThreadPool(2);

    executorService.submit(new Runnable() { 
        @Override 
        public void run() { 
            doSomething(1); 
        } 
    });

    executorService.submit(new Runnable() { 
        @Override 
        public void run() { 
            doSomething(2); 
        } 
    });

    executorService.submit(new Runnable() { 
        @Override 
        public void run() { 
            doSomething(3); 
        } 
    });

    executorService.shutdown(); 
    System.out.println(">>main thread end.");

}

首先,创建了一个线程池,里面有2个线程:

ExecutorService executorService = Executors.newFixedThreadPool(2);

然后,通过submit()方法,提交一个Runnable的实例,这个实例将交由线程池中空闲的线程执行。

在main线程中直接运行了:

executorService.shutdown();

不必担心,线程池不会直接关闭的,只有当它执行完所有提交的任务后才会关闭。如果不写这行,在本例中,应用将不会停止,因为虽然main线程(就是运行main方法的线程,也叫主线程)退出了,但是线程池中依然有线程运行,因此应用(进程)不会退出。

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

http://marshal.easymorse.com/archives/3085

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

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

image

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

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

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

备注:

 handler.post(new Runnable() {

                        @Override 
                        public void run() { 
                            ((ImageView) LazyLoadImageActivity.this 
                                    .findViewById(id)) 
                                    .setImageDrawable(drawable); 
                        } 
                    }); 
API中的解释:

boolean android.os. Handler.post( Runnable r)

Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.

Parameters:
r The Runnable that will be executed.
Returns:
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
这是android提供的一种机制,handler对象将通过post方法,将里面的Runnable对象放到UI执行队列中,UI消费这个队列,调用Runnable的run方法。这里并不生成新的线程。

Android中通过Handler对象的post()方法将一个线程加入线程队列的时候,直接调用了Runnable的run()方法,并没有调用start()方法;也就是说Run()方法所执行的内容还是在

主线程中进行,post()方法并没有启动新的线程;

利用handler.post()更新UIhttp://hi.baidu.com/xcmxjge/blog/item/d51d5034d399fd345bb5f52e.html

1.创建一个Handler 2.调用Handler.post(Runnable r)方法 3.Runnable运行在UI所在线程,所以可以直接调用View.invalidate()

public class TestHandler extends Activity {   
     private MyView myView;   
     private Handler mHandler;   
     public void onCreate(Bundle savedInstanceState) {   
         super.onCreate(savedInstanceState);   
         myView = new MyView(this);   
         //创建一个Handler 
         mHandler = new Handler(); 
         //调用Handler.post(Runnable r)方法 
         mHandler.post(new Runnable(){   
             @Override   
             public void run() {   
                 //直接调用View.invalidate(),更新组件 
                 myView.invalidate();   
                 //延迟5毫秒后执行线程 
                 mHandler.postDelayed(this, 5);   
             }   
          });   
         setContentView(myView);   
     }   
        
     class MyView extends View{   
         private float x = 0f;   
         public MyView(Context context) {   
             super(context);   
                
     }   
         protected void onDraw(Canvas canvas) {   
             super.onDraw(canvas);   
             x+=1;   
             Paint mPaint = new Paint();   
             mPaint.setColor(Color.BLUE);   
             canvas.drawRect(x, 40, x+40, 80, mPaint);   
         }   
            
     }   
 }  
在新线程里更新UI,可以直接postInvalidate() ,不需要转到UI线程再进行刷新

	public void onCreate(Bundle savedInstanceState) {    
                super.onCreate(savedInstanceState);    
                this.requestWindowFeature(Window.FEATURE_NO_TITLE);    
	   
                myView = new MyView(this);
	       this.setContentView(this.myView);    
	       new Thread(new myThread()).start();   
	}    
   
     class myThread implements Runnable {    
	          public void run() {   
	              while (!Thread.currentThread().isInterrupted()) {    
	                   try {
	                	      myView.postInvalidate(); 
	                        Thread.sleep(100);     
	                   } catch (InterruptedException e) {    
	                        Thread.currentThread().interrupt();    
	                   }    
	               }    
	          }    
     } 

Java Http异步加载图片 Java http异步加载网络图片,没有第三方包,都是Java原始类 立即下载

相关推荐

java做的ajax异步上传 图片或文件的demo

java做的ajax异步上传 图片或文件的demo 下载直接可以在eclipse的Tomact的里面运行!注意(配置自己的 jdk和tomcat!)

java图片异步加载_AsyncTask用法和异步加载图片

AsyncTask:是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。AsyncTask(异步任务),从字面上来说,就是在我们的UI主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中...

weixin_29169899的博客 267

异步加载图片

异步加载图片继承,实现显示图片 ,好好学习吧,非常有用

异步加载图片(一)

前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点大,讲起来也不太好讲,我尽力讲的明白些,其实还是要多看代码,自己摸索摸索,动手写写就什么都理解了。 实现效果: 1、异步加载图片,在加载图片时,先加载一个默认的图片,然后在后台加载图片,加载完成后

启舰 2万+

异步下载图片,可以防止内存溢出

异步下载图片,可用于listView 可以有效避免内存溢出

java异步上传图片示例

主要介绍了java异步上传图片示例,需要的朋友可以参考下

java图片异步加载_使用java concurrent处理异步加载图片功能

转载:http://marshal.easymorse.com/archives/3081java5开始,增加了concurrent api,用于并发处理。比如起多个线程并发从网络上下载图片,然后在本地显示。这里写个简单的代码,来说明如何使用concurrent api提供的线程连接池。运行结果类似这样:start do 1 task …>>main thread end.start ...

weixin_42309785的博客 623

零代码做游戏:AI辅助开发HTML5网页小游戏从创意到发布全流程

在软件开发领域,自然语言编程正成为一种新兴的人机协作方式,而AI辅助开发则是其最典型的落地形态。它让开发者无需精通语法,只需用清晰的语言描述游戏规则与交互逻辑,AI便能自动生成可运行的代码。这种模式大幅降低了编程门槛,尤其适合快速验证创意、制作原型。对于HTML5网页游戏而言,借助AI生成单个HTML文件,配合在线运行环境,即可在浏览器中直接试玩、迭代与分享。无论是产品经理验证玩法、运营人员制作互动小游戏,还是教育者设计课堂闯关,都能通过自然语言描述需求,让AI完成代码实现与报错修复。本文完整记录了一个“接

weixin_31497453的博客 334

java图片异步加载_Listview异步加载图片之优化篇

在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标。关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化。有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏…贴张效果图先:2013-2-1 17:25 上传下载附件...

weixin_30444111的博客 339

告别WSL!用AMD ROCm7在Windows上跑ComfyUI,我的幻x2025 AI Max+ 395体验与性能调优心得

本文详细介绍了在搭载AMD Ryzen AI Max+ 395处理器的幻x2025笔记本上,如何通过ROCm7在Windows原生环境下高效运行ComfyUI,并分享了一系列性能调优技巧和实战经验,帮助开发者摆脱WSL束缚,提升AI创作效率。

weixin_29102619的博客 1115

Delta并联机构运动学正逆解:从理论建模到Matlab实战

本文深入解析了Delta并联机构运动学正逆解的核心原理与实战方法。通过几何建模,清晰阐述了其“逆解简单、正解复杂”的特性,并详细推导了基于一元二次方程的逆解解析算法与采用牛顿-拉弗森迭代法的正解数值算法。文章结合完整的Matlab代码实例,从符号推导到数值求解,提供了从理论到实践的完整实现路径,助力机器人开发者掌握Delta并联机构的运动学分析。

weixin_29096377的博客 433

异步实时加载图片

很多时候我们都用得到异步实时加载图片,方式很多,以下是方法之一,实现较为简单; 话不多说直接上代码 getImageWithUrlAsyncTask.class import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; import java.io.ByteArrayOutputStream; import java

顺着天赋做事,逆着性格做人 600

【WRF-Chem教程-附录B】使用 MOZART 与WRF-Chem

使用MOZART与WRF-Chem

WW、forever的博客 242

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

在android异步加载ListView中的图片中使用异步方式加载的图片,当时要的急,写的很粗糙,是为每个图片加载一个线程来实现的。 可以用java concurrent很简明的实现类似功能,并且用到线程池。 这里加载的图片,都是从网上直接获取的。如果用android的UI线程,则需要图片全部加载后才能显示界面。 这里使用了concurrent api通过后台线程并发获取,本例中线程池中...

132

【图像去噪】论文复现:CLIP用于图像去噪提升泛化性!CLIPDenoising的Pytorch源码复现,跑通CLIPDenoising全流程,图文结合,网络结构梳理和拆解,对应源码注释!

论文题目:Transfer CLIP for Generalizable Image Denoising —— 用于可泛化图像去噪的转移CLIP。【图像去噪】论文精读:Transfer CLIP for Generalizable Image Denoising(CLIPDenoising)CLIPDenoising理论部分详解见上面对应的论文精读,本文以源码为主,理论部分只是粗略回顾。启发:多看其他领域的文章,分析是否能应用在去噪领域,这是产生idea的要素之一;

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1414

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大,联网采集不复杂。

若云流风的专栏 2495

android的异步加载与UI

原帖地址: http://blog.163.com/freemanls@126/blog/static/16458506120117702029517/ android的异步加载与UI   2011-08-07 12:55:27|  分类: Android |  标签:android  异步  图片   |字号 订阅

sumakira的专栏 6439

Holosoma 开源人形机器人强化学习训练部署框架

Holosoma是一个综合性人形机器人框架,支持强化学习策略的训练、部署和动作重定位。该框架兼容多种模拟器(IsaacGym、IsaacSim、MuJoCo等)和机器人(Unitree G1、Booster T1),提供运动控制和全身追踪功能。主要特性包括:跨模拟器训练评估、Wandb集成、多GPU支持、自定义奖励权重和观测噪声配置。推理模块支持实体机器人部署和MuJoCo仿真测试。动作重定位工具可将人体动作数据转换为机器人动作,支持单序列和批量处理。文档详细介绍了训练配置、评估方法和高级功能,如课程学习和

2506_90492529的博客 1829

Android异步下载网络图片(3)

在第一节中,我们使用Handler、Thread/Runnable 、URL、HttpURLConnection等等来进行异步下载网络图片。然后第二节中换了AsyncTask方式。那么这一节我们再应用其他方式,这个方式与第一节有点雷同,感觉走了一圈回到原地,只是风景更加美丽。人生很多时候也是如此,从NULL中来再回到NULL中。 那么它是谁呢?java.util.concurrent java

yuxiaohui78的专栏 677

Windows 11 安装 OpenClaw(龙虾):不用WSL、不用虚拟机、启动、使用、停止、卸载

本文详解 Windows 11 原生安装 OpenClaw(龙虾)全流程,无需 WSL 或虚拟机。涵盖环境配置、安全警示、模型接入(如通义千问)及技能初始化。提供启动、文件自动化操作、停止与卸载的完整指南,并附常见认证过期解决方案。助您快速部署本地 AI 智能体,实现电脑操作自动化,提升工作效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 901

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android 异步加载解决方案

原:http://www.open-open.com/lib/view/open1345017746897.html Android的Lazy Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍Android开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下Android开发过程中需要注意的几个地方。 A

u010137365的专栏 461

假人有限元模型

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

Android异步下载网络图片

项目中有时候需要获取网络上的图片,并下载下来到手机客户端显示。怎么做呢? 实现思路是:  1:在UI线程中启动一个线程,让这个线程去下载图片。  2:图片完成下载后发送一个消息去通知UI线程  2:UI线程获取到消息后,更新UI。  这里的UI线程就是主线程。  这两个步骤涉及到一些知识点,即是:ProgressDialog,Handler,Thread/Runnable,URL

LVXIANGAN的专栏 1185

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android异步加载解决方案

Android的Lazy  Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。Android开发过程中,异步处理是最常见的技术问题。 Android应用开发过程中必须遵循单线程模型(Single  Thread  Model)的原则。因为Android的UI线程操作并不是安全的,所以设计UI的操作必须在UI线程中完成。但是并非所有的操作

u011144355的专栏 694
上一篇: 在Release版本中如何关闭Debug版本中的log
下一篇: 学习笔记 ---- 设计模式之观察者模式
GaoJava08
博客等级 码龄18年 201粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值