欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-27 08:29:20
...

作为职场小白,在做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);
                }


运行结果如下:

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




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

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设置资源
        }
    }

}


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