Android进阶—线程池

来源:互联网 发布:移动通信 算法 招聘 编辑:程序博客网 时间:2024/05/16 10:59
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
 import java.io.IOException;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.os.Message;import android.os.SystemClock;import android.util.Log;import android.widget.ImageView; public class MainActivity extends Activity {        @Override        public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.main);                loadImage3("http://www.baidu.com/img/baidu_logo.gif", R.id.imageView1);                loadImage3("http://www.chinatelecom.com.cn/images/logo_new.gif",                                R.id.imageView2);                loadImage3("http://cache.soso.com/30d/img/web/logo.gif",                                R.id.imageView3);                loadImage3("http://csdnimg.cn/www/images/csdnindex_logo.gif",                                R.id.imageView4);                loadImage3("http://images.cnblogs.com/logo_small.gif",                                R.id.imageView5);        }         private Handler handler = new Handler();         private ExecutorService executorService = Executors.newFixedThreadPool(5);         // 引入线程池来管理多线程        private void loadImage3(final String url, final int id) {                executorService.submit(new Runnable() {                        public void run() {                                try {                                        final Drawable drawable = Drawable.createFromStream(                                                        new URL(url).openStream(), "image.png");                                        // 模拟网络延时                                        SystemClock.sleep(2000);                                        handler.post(new Runnable() {                                                public void run() {                                                        ((ImageView) MainActivity.this.findViewById(id))                                                                        .setImageDrawable(drawable);                                                }                                        });                                } catch (Exception e) {                                        throw new RuntimeException(e);                                }                        }                });        }}



加上缓存

package ghj1976.AndroidTest; import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.SystemClock; public class AsyncImageLoader3 {        // 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)        public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();                 private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务        private final Handler handler = new Handler();         /**         *          * @param imageUrl         *            图像url地址         * @param callback         *            回调接口         * <a href="\"http://www.eoeandroid.com/home.php?mod=space&uid=7300\"" target="\"_blank\"">@return</a> 返回内存中缓存的图像,第一次加载返回null         */        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() {                        public void run() {                                try {                                        final Drawable drawable = loadImageFromUrl(imageUrl);                                                                                          imageCache.put(imageUrl, new SoftReference<Drawable>(                                                        drawable));                                         handler.post(new Runnable() {                                                public void run() {                                                        callback.imageLoaded(drawable);                                                }                                        });                                } catch (Exception e) {                                        throw new RuntimeException(e);                                }                        }                });                return null;        }         // 从网络上取数据方法        protected Drawable loadImageFromUrl(String imageUrl) {                try {                        // 测试时,模拟网络延时,实际时这行代码不能有                        SystemClock.sleep(2000);                         return Drawable.createFromStream(new URL(imageUrl).openStream(),                                        "image.png");                 } catch (Exception e) {                        throw new RuntimeException(e);                }        }         // 对外界开放的回调接口        public interface ImageCallback {                // 注意 此方法是用来设置目标对象的图像资源                public void imageLoaded(Drawable imageDrawable);        }}


0 0
原创粉丝点击