一
1、URL对象代表统一资源定位器,它是指向互联网“资源”的指针。例如对数据库或搜索引擎的查询。URL可以由协议名、主机、端口和资源组成。即:protocol://host:port/resourceName 例如:http://www.crazyit.org/index.php
2、URL类提供了多个构造方法用于创建URL对象,一旦获得了 URL对象之后,可以调用如下常用方法来访问该URL对应的资源:
1) StringgetFile():获取此URL的资源名。
2) StringgetHost():获取此URL的主机名。
3) StringgetPath():获取此URL的路径部分。
4) Int getPort():获取此URL的端口号。
5) StringgetProtocol():获取此 URL 的协议名称。
6)String getQuery():获取URL的查询字符串部分
7)URLConnection openConnection():
8)InputStream openStream():打开与此URL的链接,并返回一个用于读取该URL资源的InputStream
3、使用URL读取网络资源
public class MainActivity extends AppCompatActivity { ImageView show; //代表从网络下载的图片 Bitmap bitmap; Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==0x123){//这个值就是一个标志,handle接受多个message的时候,进行区分给与对应操作的 //调用Image显示图片 show.setImageBitmap(bitmap); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show= (ImageView) findViewById(R.id.imgShow); //创建并启动一个新线程用于从网络上下载图片 new Thread(){ @Override public void run() { try { //创建一个URL对象 URL url=new URL("http://avatar.csdn.net/1/1/E/1_fengyuzhengfan.jpg"); //打开URL对应的资源输入流 InputStream is=url.openStream(); //把InputStream转化成ByteArrayOutputStream ByteArrayOutputStream baos=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int len; while((len=is.read(buffer))>-1){ baos.write(buffer,0,len); } baos.flush(); is.close();//关闭输入流 //将ByteArrayOutputStream转化成InputStream is=new ByteArrayInputStream(baos.toByteArray()); //将InputStream解析成Bitmap bitmap= BitmapFactory.decodeStream(is); //通知UI线程显示图片 handler.sendEmptyMessage(0x123); //再次将ByteArrayOutputStream转化成InputStream is=new ByteArrayInputStream(baos.toByteArray()); baos.close(); //打开手机文件对应的输出流 OutputStream os=openFileOutput("dw.jpg",MODE_PRIVATE);//手机对应的文件名 byte[] buff=new byte[1024]; int count=0; //将URL对应的资源下载到本地 while ((count=is.read(buff))>0){ os.write(buff,0,count); } os.flush(); //关闭输入输出流 os.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }
4、因为程序需要访问互联网,所以需要授予该程序访问网络的权限,也就是需要在 AndroidManifest.xml文件中增加如下授权代码:
<!-- 授权访问网络-->
<uses-permissionandroid:name="android.permission.INTERNET"/>
二
1、使用 URLConnection 提交请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接。程序可以通过URLConnection实例向URL发送请求,读取URL引用的资源。
通常创建一个和URL的连接,并发送请求、读取此URL引用的资源需要如下几个步骤:
1)通过调用URL对象openConnection()方法来创建URLConnection对象。
2) 设置URLConnection的参数和普通请求属性。
3) 如果只是发送GET方式请求,使用connect方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数,即是GET方法不需要传参,POST方法需要传参。
4) 远程资源变为可用,程序可以访问远程资源的头字段,或通过输入流读取远程资源的数据。
在建立和远程资源的实际连接之前,程序可以通过如下方法来设置请求头字段:
Ø setAllowUserlnteraction:设置该URLConnection 的allowUserlnteraction 请求头字段的值。
Ø setDoInput:设置该URLConnection的dolnput请求头字段的值。
Ø setDoOutput:设置该 URLConnection 的doOutput请求头字段的值。
Ø setlfModifiedSince:设置该URLConnection 的ifModifiedSince 请求头字段的值。
Ø setUseCaches:设置该 URLConnection 的 useCaches 请求头字段的值。
Ø setRequestProperty(String key, String value):设置该URLConnection 的 key 请求头字段的值为value。如以下代码所示:
conn.setRequestProperty("accept", "*/*")
Ø addRequestProperty(String key, String value):为该URLConnection 的 key 请求头字段的增加value值。该方法并不会播盖原请求头字段的值,而是将新值追加到原请求头字段中。
Ø Object getContent():获取该 URLConnection 的内容。
Ø String getHeaderField(String name):获取指定响应头字段的值。
Ø getlnputStream():返回该URLConnection对应的输入流,用于获取URLConnection响应的内容。
Ø getOutputStream():返回该URLConnection 对应的输出流,用于向URLConnection发送请求参数。
注意:如果既要使用输入流读取URLConnection响应的内容,也要使用输出流发送请求参数,一定要先使用输出流,再使用输入流。
getHeaderField()方法用于根据响应头字段来返回对应的值。而某些头字段由于经常需要访问,所以Java提供了以下方法来访问特定响应头字段的值。
Ø getContentEncoding:获取 content-encoding 响应头字段的值。
Ø getContentLength:获取 content-length 响应头字段的值。
Ø getContentType:获取 content-type 响应头字段的值。
Ø getDate():获取date响应头字段的值。
Ø getExpiration():获取expires响应头字段的值。
Ø getLastModified():获取 last-modified 响应头字段的值。