android异步加载网络图片(1)

来源:互联网 发布:nba季后赛各项数据统计 编辑:程序博客网 时间:2024/06/07 06:02

说到异步加载,就会想到Thread,AsyncTask;
说到连接网络,可以使用HttpURLConnection,HttpClick
不多说什么,直接在代码中讲解吧。
1,先创建一个网络连接工具类HttpUtil,里面有两个方法,一个使用HttpURLConnection网络连接获取图片,另外一个使用HttpClick连接网络获取图片。
(1)使用:HttpURLConnection

 public static Bitmap getHttpURLConnectionBitmap(String address) {        Bitmap bitmap;        InputStream inputStream = null;        BufferedInputStream bufferedInputStream = null;        try {            URL url=new URL(address);            HttpURLConnection connection= (HttpURLConnection) url.openConnection();            inputStream=connection.getInputStream();            bufferedInputStream=new BufferedInputStream(inputStream);            bitmap= BitmapFactory.decodeStream(bufferedInputStream);            connection.disconnect();//关闭            return  bitmap;        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally {            try {                bufferedInputStream.close();                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }    }

(2)使用HttpClick:

public  static Bitmap getHttpClickBitmap(String address) throws IOException {         HttpClient httpClient =new DefaultHttpClient();        HttpGet httpGet=new HttpGet(address);//Get 请求        HttpResponse httpResponse = null;        try {            httpResponse = httpClient.execute(httpGet);            if (httpResponse.getStatusLine().getStatusCode()==200) {                //请求成功                HttpEntity entity = httpResponse.getEntity();                byte[] data = new byte[1024];                data = EntityUtils.toByteArray(entity);                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);                return bitmap;            }        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    }

2,上面已经把网络获取图片工具类写好了,现在就在MainActivity类中写异步加载网络图片,因为加载网络图片时更新UI是不能在主线程操作的,所以我们开辟一个线程Thread或创建一个类继承AsyncTask。
(1)在MainActivity里面写一个showImageViewbyThread(String url)方法,更新UI的是一张图片,返回类型是Bitmap。

 public Handler mHandel=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);               Bitmap bitmap= (Bitmap) msg.obj;               //更新UI               mImageView.setImageBitmap(bitmap);            }             }    };/**url 图片的地址*/public Bitmap showImageViewbyThread(String url){//线程     new Thread(){            @Override            public void run() {                super.run();                //通过网络获取图片                Bitmap bitmap=getHttpURLConnectionBitmap(url);                Message message=Message.obtain();                message.obj=bitmap;                //通过handle发送消息                mHandel.sendMessage(message);            }        }.start();}

(2)使用AsyncTack:在activity新建一个内部类继承AsyncTack,重写里面的父类的方法

/**String 图片的URL地址*Bitmap 返回一张图片*/class HttpImageAsyncTack extends AsyncTack<String,Void,Bitmap>{       /*        后台线程操作         */        @Override        protected Bitmap doInBackground(String... params) {            String param=params[0];            Bitmap bitmap=null;            try {                bitmap=HttpUtil.getHttpClickBitmap(param);                return  bitmap;            } catch (IOException e) {                e.printStackTrace();            }            return bitmap;        }        /*        改变UI         */        @Override        protected void onPostExecute(Bitmap bitmap) {            super.onPostExecute(bitmap);            //显示图片            mImageView.setImageBitmap(bitmap);        }}

3,最后就在activity的onCreate()方法里面调用
如果使用第2(1)Thread的话

showImageViewbyThread(url);

如果使用2(2)AsyncTack的话

new HttpImageAsyncTack ().execute(url);

今天暂时更时到这里。

0 0