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(); } } }