android利用多线程加载图片【不使用第三方库】

前言

这是一份关于android利用线程池加载图片的demo。有部分参考意义。

代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是四种线程池的测试实验"/>



    <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <TableRow>
            <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SingleThreadExecutor" android:id="@+id/btn_SingleThreadExecutor"/>
            <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="FixedThreadPool" android:id="@+id/btn_FixedThreadPool"/>

        </TableRow>
        <TableRow>
            <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CachedThreadPool" android:id="@+id/btn_CachedThreadPool"/>
            <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ScheduledThreadPool" android:id="@+id/btn_ScheduledThreadPool"/>
        </TableRow>
        <TableRow>
            <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="实际环境中的图片加载" android:id="@+id/btn_production"/>
        </TableRow>
    </TableLayout>


    <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content">

        <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/panel_list">


        </LinearLayout>

    </ScrollView>
</LinearLayout>
package com.example.apppractise.app;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.Image;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.Volley;
import com.example.Sys.utils.ImgUtil;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by Administrator on 2015/7/3.
 */
public class ThreadPoolDemo extends Activity {

    private Button btn_singleThreadPool;
    private Button btn_fixedThreadPool;
    private Button btn_canchedThreadPool;
    private Button btn_scheduledThreadPool;

    private Button btn_production;

    private LinearLayout panelList;
    Handler handler=new Handler();

    ExecutorService pool_single;
    ExecutorService pool_fixed;
    ExecutorService pool_cached;
    ExecutorService pool_schedule;
    RequestQueue mQueue;

    class ImageURLInfo{
        public String url="";
        public String title="";
        public ImageURLInfo(){}
        public ImageURLInfo(String _url,String _title){
            url=_url;
            title=_title;
        }
    }

    //--这是图片数据列表。这个先随便在网上搜几幅图片来,然后再加载。
    protected ArrayList<ImageURLInfo> urlInfos=new ArrayList<ImageURLInfo>();

    @Override
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.thread_pool_demo);
        mQueue= Volley.newRequestQueue(this);
        initData();
        initUI();
        initEvents();
    }
    private void initUI(){
        panelList=(LinearLayout)findViewById(R.id.panel_list);
        btn_singleThreadPool=(Button)findViewById(R.id.btn_SingleThreadExecutor);
        btn_fixedThreadPool=(Button)findViewById(R.id.btn_FixedThreadPool);
        btn_canchedThreadPool=(Button)findViewById(R.id.btn_CachedThreadPool);
        btn_scheduledThreadPool=(Button)findViewById(R.id.btn_ScheduledThreadPool);
        btn_production=(Button)findViewById(R.id.btn_production);

    }
    private void initEvents(){
        btn_singleThreadPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clearList();

                //--将相关图片获取出来。
                for(int i=0;i<urlInfos.size();i++){
                    final ImageURLInfo iinfo=urlInfos.get(i);
                    pool_single.execute(new Runnable() {
                        @Override
                        public void run() {
                            appendImage(iinfo);
                            try{
                            Thread.sleep(2000);}
                            catch (Exception ed){
                                ed.printStackTrace();
                            }
                        }
                    });
                }


            }
        });
        btn_fixedThreadPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clearList();

                //--将相关图片获取出来。
                for(int i=0;i<urlInfos.size();i++){
                    final ImageURLInfo iinfo=urlInfos.get(i);
                    pool_fixed.execute(new Runnable() {
                        @Override
                        public void run() {
                            appendImage(iinfo);
                            try{
                                Thread.sleep(2000);}
                            catch (Exception ed){
                                ed.printStackTrace();
                            }
                        }
                    });
                }
            }
        });

        btn_canchedThreadPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clearList();

                //--将相关图片获取出来。
                for(int i=0;i<urlInfos.size();i++){
                    final ImageURLInfo iinfo=urlInfos.get(i);
                    pool_cached.execute(new Runnable() {
                        @Override
                        public void run() {
                            appendImage(iinfo);
                            try{
                                Thread.sleep(2000);}
                            catch (Exception ed){
                                ed.printStackTrace();
                            }
                        }
                    });
                }
            }
        });
        btn_scheduledThreadPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clearList();

                //--将相关图片获取出来。

                for(int i=0;i<urlInfos.size();i++){
                    final ImageURLInfo iinfo=urlInfos.get(i);
                    pool_schedule.execute(new Runnable() {
                        @Override
                        public void run() {
                            appendImage(iinfo);
                            try{
                               // Thread.sleep(2000);
                               }
                            catch (Exception ed){
                                ed.printStackTrace();
                            }
                        }
                    });
                }
            }
        });
        btn_production.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clearList();
                loadImagesInProduction();
            }
        });
    }
    private void initData(){

        pool_single = Executors. newSingleThreadExecutor();
        pool_fixed=Executors.newFixedThreadPool(2);
        pool_schedule=Executors.newScheduledThreadPool(5);
        pool_cached=Executors.newCachedThreadPool();


        urlInfos.add(new ImageURLInfo("http://att2.citysbs.com/guangzhou/sns01/forum/2011/05/23-17/20110523_5fbe97609ec6dcbcf8390UKPwPXpNu8v.jpg","我们的婚礼"));
        urlInfos.add(new ImageURLInfo("http://imgst-dl.meilishuo.net/pic/_o/85/fb/e4b47e2b627c0b426936848c027d_1944_2592.jpeg","飞机上某个女孩自拍照"));
        urlInfos.add(new ImageURLInfo("http://cdn.duitang.com/uploads/item/201405/16/20140516134733_L5zhQ.jpeg","浓妆艳抹女孩的红唇"));
        urlInfos.add(new ImageURLInfo("http://photo.sohu.com/20041013/Img222475331.jpg","清爽女孩自拍【鱼泡眼还是卧蚕?】"));
        urlInfos.add(new ImageURLInfo("http://img1d.xgo-img.com.cn/pics/401/400109.jpg","一个车模【工作辛苦,汗如雨下啊】"));
        urlInfos.add(new ImageURLInfo("http://pic.cnhubei.com/attachment/201203/1/2781_13305689234Uuh.jpg","有山有水有女人【请忽略女人吧,1m多的图片,可以测试加载速度】"));
        urlInfos.add(new ImageURLInfo("http://ff.topit.me/f/be/ff/1141477403584ffbefo.jpg","韩国洗剪吹【我真分不出韩国男明星,感觉都一样 囧】"));
        urlInfos.add(new ImageURLInfo("http://img1.ph.126.net/dMMszRbV4BKyzzy3Jo9PaQ==/2680486203232537044.jpg","范晓萱广告封面【范晓萱是谁】"));
        urlInfos.add(new ImageURLInfo("http://photo.sohu.com/20041013/Img222475337.jpg","凳子上的女孩【主角感觉是那张黄凳子,太显眼了】"));
        urlInfos.add(new ImageURLInfo("http://cms.gdzjdaily.com.cn/2011bb/upload/2010-12/1293267071.jpg","爱尔美广告封面【我没打广告,用用图片而已】"));

    }
    private void clearList(){
        panelList.removeAllViews();
    }

    private void appendImage(ImageURLInfo imageURLInfo){
        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpGet httpget = new HttpGet(imageURLInfo.url);

        try {
            HttpResponse resp = httpclient.execute(httpget);
            //判断是否正确执行
            if (HttpStatus.SC_OK == resp.getStatusLine().getStatusCode()) {
                //将返回内容转换为bitmap
                HttpEntity entity = resp.getEntity();
                InputStream in = entity.getContent();
                BitmapFactory.Options boptions=new BitmapFactory.Options();
                boptions.inJustDecodeBounds=true;
                try {
                    byte[] imgdata=readStream(in);


                    //BitmapFactory.decodeStream(in,null,boptions);
                    BitmapFactory.decodeByteArray(imgdata,0,imgdata.length,boptions);
                    int imageHeight=boptions.outHeight;
                    int imageWidth=boptions.outWidth;
                    boptions.inJustDecodeBounds=false;
                    int inSampleSize=ImgUtil.calculateInSampleSize(imageWidth,imageHeight,200,200);
                    boptions.inSampleSize=inSampleSize;
                    //final Bitmap resizeBitmap=BitmapFactory.decodeStream(in,null,boptions);
                    final Bitmap resizeBitmap=BitmapFactory.decodeByteArray(imgdata, 0, imgdata.length, boptions);
                    //final Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(),new Matrix(), false);

                    //向handler发送消息,执行显示图片操作

                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            ImageView imageView=new ImageView(ThreadPoolDemo.this);
                            imageView.setImageBitmap(resizeBitmap);
                            panelList.addView(imageView);
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }
                in.close();




            }

        } catch (Exception e) {
            e.printStackTrace();
            setTitle(e.getMessage());
        } finally {
            httpclient.getConnectionManager().shutdown();
        }
    }
    /*
         * 得到图片字节流 数组大小
         * */
    public static byte[] readStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while( (len=inStream.read(buffer)) != -1){
            outStream.write(buffer, 0, len);
        }
        outStream.close();
        inStream.close();
        return outStream.toByteArray();
    }

    private void loadImagesInProduction(){
        for(int i=0;i<urlInfos.size();i++){
            ImageURLInfo info=urlInfos.get(i);
            ImageRequest imageRequest=new ImageRequest(info.url, new Response.Listener<Bitmap>() {
                @Override
                public void onResponse(Bitmap response) {
                    ImageView imageView=new ImageView(ThreadPoolDemo.this);
                    imageView.setImageBitmap(response);
                    panelList.addView(imageView);
                    Log.e("log", "抓取成功");
                }
            }, 400, 400, Bitmap.Config.ARGB_4444, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    ImageView imageView=new ImageView(ThreadPoolDemo.this);


                    error.printStackTrace();
                    imageView.setImageResource(R.drawable.ui_imgselect_albums_bg);
                    panelList.addView(imageView);
                    Log.e("log","抓取失败");
                }
            });
            mQueue.add(imageRequest);
        }

    }
    @Override
    protected void onStop(){
        super.onStop();
        pool_single.shutdown();
        pool_fixed.shutdown();
        pool_cached.shutdown();
        pool_schedule.shutdown();

    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值