zoukankan      html  css  js  c++  java
  • 线程池相关【转】

    Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式【转】

    转自:http://www.eoeandroid.com/thread-210082-1-1.html

    Handler+ExecutorService(线程池)+MessageQueue+缓存模式

    下面比起前一个做了几个改造:

    • 把整个代码封装在一个类中
    • 为了避免出现同时多次下载同一幅图的问题,使用了本地缓存

    封装的类:

     1 package ghj1976.AndroidTest;
     2  
     3 import java.lang.ref.SoftReference;
     4 import java.net.URL;
     5 import java.util.HashMap;
     6 import java.util.Map;
     7 import java.util.concurrent.ExecutorService;
     8 import java.util.concurrent.Executors;
     9  
    10 import android.graphics.drawable.Drawable;
    11 import android.os.Handler;
    12 import android.os.SystemClock;
    13  
    14 public class AsyncImageLoader3 {
    15         // 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)
    16         public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
    17          
    18         private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务
    19         private final Handler handler = new Handler();
    20  
    21         /**
    22          * 
    23          * @param imageUrl
    24          *            图像url地址
    25          * @param callback
    26          *            回调接口
    27          * <a href="\"http://www.eoeandroid.com/home.php?mod=space&uid=7300\"" target="\"_blank\"">@return</a> 返回内存中缓存的图像,第一次加载返回null
    28          */
    29         public Drawable loadDrawable(final String imageUrl,
    30                         final ImageCallback callback) {
    31                 // 如果缓存过就从缓存中取出数据
    32                 if (imageCache.containsKey(imageUrl)) {
    33                         SoftReference<Drawable> softReference = imageCache.get(imageUrl);
    34                         if (softReference.get() != null) {
    35                                 return softReference.get();
    36                         }
    37                 }
    38                 // 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
    39                 executorService.submit(new Runnable() {
    40                         public void run() {
    41                                 try {
    42                                         final Drawable drawable = loadImageFromUrl(imageUrl); 
    43                                                  
    44                                         imageCache.put(imageUrl, new SoftReference<Drawable>(
    45                                                         drawable));
    46  
    47                                         handler.post(new Runnable() {
    48                                                 public void run() {
    49                                                         callback.imageLoaded(drawable);
    50                                                 }
    51                                         });
    52                                 } catch (Exception e) {
    53                                         throw new RuntimeException(e);
    54                                 }
    55                         }
    56                 });
    57                 return null;
    58         }
    59  
    60         // 从网络上取数据方法
    61         protected Drawable loadImageFromUrl(String imageUrl) {
    62                 try {
    63                         // 测试时,模拟网络延时,实际时这行代码不能有
    64                         SystemClock.sleep(2000);
    65  
    66                         return Drawable.createFromStream(new URL(imageUrl).openStream(),
    67                                         "image.png");
    68  
    69                 } catch (Exception e) {
    70                         throw new RuntimeException(e);
    71                 }
    72         }
    73  
    74         // 对外界开放的回调接口
    75         public interface ImageCallback {
    76                 // 注意 此方法是用来设置目标对象的图像资源
    77                 public void imageLoaded(Drawable imageDrawable);
    78         }
    79 }

    说明:

    final参数是指当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。参看:Java关键字final、static使用总结 
    这里使用SoftReference 是为了解决内存不足的错误(OutOfMemoryError)的,更详细的可以参看:内存优化的两个类:SoftReference 和 WeakReference

    前段调用:

     1 package ghj1976.AndroidTest;
     2  
     3 import android.app.Activity;
     4 import android.graphics.drawable.Drawable;
     5 import android.os.Bundle;
     6  
     7 import android.widget.ImageView;
     8  
     9 public class MainActivity extends Activity {
    10         @Override
    11         public void onCreate(Bundle savedInstanceState) {
    12                 super.onCreate(savedInstanceState);
    13                 setContentView(R.layout.main);
    14                 loadImage4("http://www.baidu.com/img/baidu_logo.gif", R.id.imageView1);
    15                 loadImage4("http://www.chinatelecom.com.cn/images/logo_new.gif",
    16                                 R.id.imageView2);
    17                 loadImage4("http://cache.soso.com/30d/img/web/logo.gif",
    18                                 R.id.imageView3);
    19                 loadImage4("http://csdnimg.cn/www/images/csdnindex_logo.gif",
    20                                 R.id.imageView4);
    21                 loadImage4("http://images.cnblogs.com/logo_small.gif",
    22                                 R.id.imageView5);
    23         }
    24  
    25         private AsyncImageLoader3 asyncImageLoader3 = new AsyncImageLoader3();
    26  
    27         // 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程
    28         private void loadImage4(final String url, final int id) {
    29                 // 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行
    30                 Drawable cacheImage = asyncImageLoader3.loadDrawable(url,
    31                                 new AsyncImageLoader3.ImageCallback() {
    32                                         // 请参见实现:如果第一次加载url时下面方法会执行
    33                                         public void imageLoaded(Drawable imageDrawable) {
    34                                                 ((ImageView) findViewById(id))
    35                                                                 .setImageDrawable(imageDrawable);
    36                                         }
    37                                 });
    38                 if (cacheImage != null) {
    39                         ((ImageView) findViewById(id)).setImageDrawable(cacheImage);
    40                 }
    41         }
    42  
    43 }

    ExecutorService的execute和submit方法【转】

    转自:http://blog.csdn.net/peachpi/article/details/6771946

  • 相关阅读:
    Gitlab安装之后不能正常启动案例解决
    SSH远程采用普通用户登录linux主机报错解决方法
    记一次AD域控客户端不能正常加域的故障处理
    Horizon7.9部署和克隆问题汇总
    VMware Guest customization fails on Linux
    Ubuntu18.04安装rabbitvcs svn图形化客户端和简单实用
    Ubuntu访问samba共享文件方法
    CentOS版本禁用Ctrl+Alt+Del重启功能
    02Kubernetes架构和组件
    01Kubernetes核心概念
  • 原文地址:https://www.cnblogs.com/heimi/p/2995796.html
Copyright © 2011-2022 走看看