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

说到异步加载,就会想到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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值