HttpHuiApplication--下载图片url,HttpURLConnection,简单版

activity_main.xml

xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="www.hui2wulian.com.httphuiapplication.MainActivity">
    

MainActivity.java

package www.hui2wulian.com.httphuiapplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void click(View view){
        //下载图片
        String path="http://img07.tooopen.com/images/20170323/tooopen_sy_202923944295.jpg"; //1.确定网址
        try {
            URL url=new URL(path);  //2.把网址封装成一个url对象(网址是个字符串,封装成url对象)。此处URL url=new URL(path);写完有红处,需要try,catch一下
            HttpURLConnection conn= (HttpURLConnection) url.openConnection();//3.获取客户端与服务器的连接对象(到这,还没有去建立连接(即还没
            //有产生任何的网络交互))。 用方法openConnection(直译是打开连接(对象),是网址跟服务器
            // 建立连接的连接对象),返回的是URLConnection( URLConnection conn=url.openConnection();),
            // 需要强转成HttpURLConnection,并导包
            conn.setRequestMethod("GET");     //设置请求方法,注意大写
            // 对连接对象进行初始化,设置你建立连接时所你需要传入的参数。连接对象的建立就是客户端给服务器发送的请求,1要设置请求方式,conn.setRequestMethod("GET");
            //HTTP请求有2种方法:"GET"和"POST",请求是浏览器帮你发出去的,提供数据时使用"POST"。而在代码中需要手动设定
            conn.setConnectTimeout(5000);//设置连接超时(超时时间8,10,20s),(连接)请求发出去,超过5s钟服务器没有任何响应(服务器5s钟没有任何响应),
            // 那就是连接(请求)超时。可能原因是自己网络不好,或是网址错,服务器根本就请求不到,又怎么会有响应呢。
            conn.setReadTimeout(5000);//设置读取超时。请求发出去了服务器有相应了(网址是对的),但超过5s钟服务器都没有把流传给你(服务器是通
            // 过流把数据写给客户端的),服务器有响应了,但是5s钟都没有把流给我们,客户端拿不到数据,就会报读取超时。
            //这3个设置好了,就基本上OK了,可以去请求发送请求了
            conn.connect();//5.发送请求,与服务器建立联系。用connect()方法,这段代码一旦执行就产生网络交互了,这时(这个时候)连接才正式建立。
            //请求发出去了到底是成功还是失败呀,(咱们怎么知道呢)通过状态码来判断(如果是200,就成功了,如果非200开头,就是失败了。
            // (如最常见的404是页面不存在,就是path的资源根本就不存在(那就是404),如果是500(就是报bug了,500开头的一个东西)))
            if (conn.getResponseCode()==200){  //如果响应码为200,说明请求成功。(怎么判断呢)拿到状态码(或是叫做响应码都可以,在不同
                // 的API当中,他的单词(ResponseCode)不一样,有的地方叫做ResponseCode,有的地方叫做StatusCode,反正知道这个东西就行),是一个数字。
                //请求成功,服务器应该给了我们一个流(如果请求成功的话,一定会有这个流。若没有这个流,就说明你请求失败了(服务器给你响应了,但是
                // 是失败的响应,如果是成功的响应,就会拿到这个流)。)
                InputStream is=conn.getInputStream();//获取服务器响应头中的流,流里的数据就是客户请求的数据(也就是叮当的图片就在流里面了)。那我们就拿到这个
                // 流conn.getInputStream();(再(后)写前面的InputStream is)。
                Bitmap bm= BitmapFactory.decodeStream(is);//读取出流里的数据,并构成位图对象。从流里读数据:创建一个byte[](byte数组)(byte[] b),再is.read(b)。
                // 现在的话其实不用这么麻烦,因为我们知道流里面的数据,就是张图片,
                //Android提供了一个很方便的API直接把流里的数据读取出来,然后构造成一张图片。Android中一个API叫做Bitmap(位图的意思,在Android中表示一张图片),
                //BitmapFactory(位图工厂)是用来生产Bitmap(位图)对象的,在BitmapFactory中有几个方法(decode...),使用来生产位图的。其中有一个叫decodeStream
                // ()(就是通过一个输入流,构造位图)返回的是位图。构造出的bm就是叮当图片了,把他写在界面上(扔到ImageView里面去)就OK了。
                ImageView iv= (ImageView) findViewById(R.id.iv);//拿到iv对象
                iv.setImageBitmap(bm);//把位图对象显示至imageview。给ImageView设置显示内容(iv.set什么什么,给Image设置对象,就是setImageResource(resId)
                // (设置图片资源,参数数资源id(指定设置图片),但这里明显不是,因为我们没有资源id(Bitmap没有资源id)。用setImageBitmap(直接把位图对象扔进去))
                // setImage什么什么,(其中用的较多就是setImageResource()。))
                //添加权限(访问网络的话有可能是要钱的(要是用手机用流量访问网络是需要钱的)),访问网络权限叫INTERNET(internet)(android.permission.INTERNET)
                //
                //创建连接对象,发送HTTP请求,获取图片,最终把他显示到界面上。
            }
            else {
                Toast.makeText(this,"请求失败",Toast.LENGTH_SHORT).show();//如果失败就弹个吐司。不用MainActivity.this,直接this就行。
                // 请求失败原因有多钟,(开发中的话)我们要通过具体的响应码判断是哪一种(这里就先不判断了)。
            }

        } catch (Exception e) {   //将MalformedURLException改为Exception
            e.printStackTrace();
        }
    }
}



你可能感兴趣的:(Android,studio)