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

来源:互联网 发布:4种九九乘法表c语言 编辑:程序博客网 时间:2024/04/30 11:00

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout 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">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="下载图片"        android:onClick="click"/>    <ImageView        android:id="@+id/iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

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)                //<uses-permission android:name="android.permission.INTERNET"></uses-permission>                //创建连接对象,发送HTTP请求,获取图片,最终把他显示到界面上。            }            else {                Toast.makeText(this,"请求失败",Toast.LENGTH_SHORT).show();//如果失败就弹个吐司。不用MainActivity.this,直接this就行。                // 请求失败原因有多钟,(开发中的话)我们要通过具体的响应码判断是哪一种(这里就先不判断了)。            }        } catch (Exception e) {   //将MalformedURLException改为Exception            e.printStackTrace();        }    }}



原创粉丝点击