android 如何使用httpurlconnection下载一张图片demo

作为职场小白,在做android 整机app, Camera和Gallery.  但是对android 网络编程理解不是很深,所以从这篇文章开始我的网络学习之旅。

首先先通过一个例子来看如何下载一张图片的。

本例子使用的是AsyncTask进行异步操作的。

分析步骤:

(1) 如何使用HttpURLConnection进行网络连接

                url = new URL("http://f.hiphotos.baidu.com/image/w%3D2048/sign=3b06d28fc91349547e1eef6462769358/d000baa1cd11728b22c9e62ccafcc3cec2fd2cd3.jpg");
                huc = (HttpURLConnection) url.openConnection(); //根据url生成的HttpURLConnection对象,此时还没开始连接网络
                int code = huc.getResponseCode();  //http状态返回代码

一般常见的状态返回代码为:

200 - 服务器成功返回网页
404 - 请求的网页不存在
503 - 服务不可用

(2) 如何获得访问网址的资源

InputStream is = huc.getInputStream();
一般使用连接时候,使用huc.connect(); 而getInputStream()中就已经包含了connect()方法,所以此时可省略。

当执行完这句话的时候,图片数据已经保存在输入流中。 

(3) 对流进行存储并转化成bitmap进行使用,记得对bitmap进行释放。

if (code == 200) {
                    InputStream is = huc.getInputStream();
                    ByteArrayOutputStream output = new ByteArrayOutputStream();
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    while ((len = is.read(buffer)) != -1) {
                        output.write(buffer, 0, len);
                    }
                    is.close();
                    output.close();
                    byte[] bytes = output.toByteArray();
                    bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                }


运行结果如下:






因为代码简单这里就直接上源码了,本来准备输入网址在下载,发现网址太长,就改成了在代码中直接写了。

package com.example.hoperun.myapplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 知道固定图片网址,下载图片demo
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText urlText = null;
    private ImageView imageView = null;
    private Button clickButton = null;
    private SearchImageAsyncTask siat = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        urlText = (EditText) findViewById(R.id.urlText);
        clickButton = (Button) findViewById(R.id.clickMe);
        clickButton.setOnClickListener(this);
        imageView = (ImageView) findViewById(R.id.imageView);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.clickMe:
                if (!TextUtils.isEmpty(urlText.getText().toString())) {
                    siat = new SearchImageAsyncTask();
                    siat.execute(urlText.getText().toString());
                } else {
                    Toast.makeText(MainActivity.this, "请输入网址", Toast.LENGTH_LONG).show();
                }
                break;
            default:
                break;
        }
    }


    public class SearchImageAsyncTask extends AsyncTask<String, Void, Bitmap> {

        private URL url = null;
        private HttpURLConnection huc = null;
        Bitmap bitmap = null;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Bitmap doInBackground(String... strings) {

            try {
                url = new URL("http://f.hiphotos.baidu.com/image/w%3D2048/sign=3b06d28fc91349547e1eef6462769358/d000baa1cd11728b22c9e62ccafcc3cec2fd2cd3.jpg");
                huc = (HttpURLConnection) url.openConnection(); 
                int code = huc.getResponseCode();  //http状态返回代码
                if (code == 200) {
                    InputStream is = huc.getInputStream();
                    ByteArrayOutputStream output = new ByteArrayOutputStream();
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    while ((len = is.read(buffer)) != -1) {
                        output.write(buffer, 0, len);
                    }
                    is.close();
                    output.close();
                    byte[] bytes = output.toByteArray();
                    bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            imageView.setImageBitmap(bitmap); //给imageview设置资源
        }
    }

}


第一次写,还不知道预览起来是什么样子,写的不好请见谅,以后会改进。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值