- 浏览: 61526 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
u014549257:
...
Apache Mina: StreamIoHandler传输文件处理 -
至尊包:
想问一下,这个官网的列子如果要兼容3.0以下的版本要怎么处理? ...
Swipe Views (水平分页)
ExecutorService: 线程池, 顾名思义是一个调度线程运行的管理池。 我预制了一个场景: 在界面上,有5个图片需要进行异步加载, 我们使用了一个线程池管理类 AsyncImageLoader来控制加载图片的线程个数,如果加载的图片原本已经存在,则从系统中调出已有图片进行加载; 如果图片是首次加载,则通过连接加载图片。
1. 需要加载5个图片的界面:
2. AsyncImageLoader类
3. 对AsyncImageLoader的调用异步加载这5个图片
1. 需要加载5个图片的界面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="图片区域开始" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_width="wrap_content"> </ImageView> <ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_width="wrap_content"> </ImageView> <ImageView android:id="@+id/imageView3" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_width="wrap_content"> </ImageView> <ImageView android:id="@+id/imageView4" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_width="wrap_content"> </ImageView> <ImageView android:id="@+id/imageView5" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_width="wrap_content"> </ImageView> <TextView android:text="图片区域结束" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> </LinearLayout>
2. AsyncImageLoader类
public class AsyncImageLoader { public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String,SoftReference<Drawable>>(); // 线程池的数量设置:在次,设置同时运行3个线程。 private ExecutorService executorService = Executors.newFixedThreadPool(3); private final Handler handler = new Handler(); public ExecutorService getExecutorService() { return executorService; } public void setExecutorService(ExecutorService executorService) { this.executorService = executorService; } public Drawable loadDrawable(final String imageUrl, final ImageCallback callback){ // 如果缓存中已经加载过该图片,则调用缓存中的图片加载 if(imageCache.containsKey(imageUrl)){ SoftReference<Drawable> softReference = imageCache.get(imageUrl); if(softReference.get()!=null){ return softReference.get(); } } // 首次加载图片的方法,使用线程池调用加载图片的线程 executorService.submit(new Runnable(){ @Override public void run() { try { // 加载图片 final Drawable drawable = loadImageFromUrl(imageUrl); // 将图片的加载路径保存到缓存中 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable)); // 图片加载完成后, 在界面中显示被加载的图片 handler.post(new Runnable() { public void run() { callback.imageLoader(drawable); } }); } catch (Exception e) { throw new RuntimeException(e); } } }); return null; } protected Drawable loadImageFromUrl(String imageUrl){ try { return Drawable.createFromStream(new URL(imageUrl).openStream(), "image.png"); } catch (Exception e) { throw new RuntimeException(e); } } public interface ImageCallback{ public void imageLoader(Drawable imageDrawable); } // 关闭线程池 public void shutdownAndAwaitTermination(ExecutorService pool) { // 关闭线程池,新的任务就不再运行 pool.shutdown(); // Disable new tasks from being submitted try { // Wait a while for existing tasks to terminate // 设置一个等待时间,使原来已经存在的任务完成其工作 if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { pool.shutdownNow(); // Cancel currently executing tasks // Wait a while for tasks to respond to being cancelled Log.i("test", "i am shutting down..."); if (!pool.awaitTermination(60, TimeUnit.SECONDS)) System.err.println("Pool did not terminate"); } }catch (InterruptedException ie) { // (Re-)Cancel if current thread also interrupted Log.e("test","something interrupted happend, and i am shutting down...."); pool.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); } } }
3. 对AsyncImageLoader的调用异步加载这5个图片
public class BatchDownloadActivity extends Activity { //需要加载的图片名称 private static final String fileRealName = "我的图片1.gif"; private String url; private int id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.batch_download); String fileName = fileRealName; String url = ""; try { url = ToolsUtil.getIpAddress() + URLEncoder.encode(fileRealName,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // url: http://xx.xx.xx.xx:port/webapp/filename.gif Log.i("test","url=" + url); // 调用加载图片方法 loadImage(url, R.id.imageView1); loadImage(url, R.id.imageView2); loadImage(url, R.id.imageView3); loadImage(url,R.id.imageView4); loadImage(url,R.id.imageView5); //加载完成后,关闭线程管理池 loader.shutdownAndAwaitTermination(loader.getExecutorService()); } private AsyncImageLoader loader = new AsyncImageLoader(); private void loadImage(final String url, final int id) { Drawable cacheImage = loader.loadDrawable(url,new AsyncImageLoader.ImageCallback() { @Override public void imageLoader(Drawable imageDrawable) { ((ImageView) findViewById(id)).setImageDrawable(imageDrawable); Log.i("test", "loading new pic"); } }); if (cacheImage != null) { ((ImageView) findViewById(id)).setImageDrawable(cacheImage); Log.i("test", "loading existing pic"); } } }
发表评论
-
android RSS reader
2013-09-26 15:04 12751. AndroidManifest.xml中的activit ... -
自定义ThreadPoolExecutor
2013-09-12 13:18 2139仍旧沿用ExecutorService的例子, 修改了Asyn ... -
使用后台服务下载文件的例子
2013-09-02 11:55 2146最近做了一个DEMO, 是通过httpURLConnectio ... -
Widget的开发: 一个最简单的例子
2013-06-14 10:29 1742首先,我们来说说基本概念。通常来说, 一个widget具备以下 ... -
Nofitication的使用
2013-05-22 15:16 999Notification的例子,请参考附件。 1. 创建N ... -
Contextual Action Mode
2013-05-13 16:05 2047我在网上查了N多文章, 结果发现,在ANDROID自带 ... -
GridView显示ICON和TEXT
2013-05-08 12:00 9931. 设置GridView的布局 <?xml ver ... -
Swipe Views (水平分页)
2013-05-07 13:36 15721. 创建activity public class Co ... -
ExpandableListFragment及其使用
2013-04-17 16:33 0xxxxxxxxxxxxxxx xxxxxxxxxxxx xx ... -
动态ActionBar
2013-04-17 16:32 1562首先介绍一下该应用的主要操作界面 1. ProvinceLay ... -
在DialogFragment中使用ExpandableList
2013-04-15 16:39 1492我本来想在ListFragment中使用Expanda ... -
Fragment开发实例
2013-03-15 12:15 1809SVN源码下载地址: https://svn.codespot ...
相关推荐
主要为大家详细介绍了java ExecutorService使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
今天小编就为大家分享一篇关于在spring boot中使用java线程池ExecutorService的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
ExecutorService的execute和submit方法
ExecutorService方法案例文件.zip
接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行。壹個 ExecutorService 实例因此特别像壹個线程池。事实上,在 java.util.concurrent 包中的 ExecutorService 的实现...
本程序实现了ExecutorService线程池,内置说明txt说明,可以参考
如果 Future 结果没有完成,调用 get() 方法,程序会 阻塞 在那里,直至获取返回结果 先来看第一种实现方式,假设任务 A 由于参数原因,执行时间相对任务 B,C,D 都要长很多,但是按照程序的执行顺序,程序在 get()...
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
主要介绍了Java使用ExecutorService来停止线程服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
NULL 博文链接:https://x125858805.iteye.com/blog/2191873
4.newSingleThreadExecutor 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。``
NULL 博文链接:https://songjianyong.iteye.com/blog/2056990
2_ExecutorService源码阅读1
使用 ExecutorService 多线程处理某个进程的简单示例。
ExecutorService10个要诀和技巧编程开发技术共9页.pdf.zip
主要介绍了java中Executor,ExecutorService,ThreadPoolExecutor详解的相关资料,需要的朋友可以参考下
主要介绍了Java利用ExecutorService实现同步执行大量线程,ExecutorService可以维护我们的大量线程在操作临界资源时的稳定性。
主要介绍了Java 线程池ExecutorService详解及实例代码的相关资料,线程池减少在创建和销毁线程上所花的时间以及系统资源的开销.如果不使用线程池,有可能造成系统创建大量线程而导致消耗系统内存以及”过度切换
主要帮助大家理解java多线程中ExcetorServiced的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了详解JDK中ExecutorService与Callable和Future对线程的支持的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下