Android之使用HttpURLConnection类查看网络图片以及网络源码

1.首先,来介绍一下HttpURLConnection类,HttpURLConnection类位于java.net包中,用于发送HTTP请求和获取HTTP响应。由于此类是抽象类,不能直接实例化对象,所以需要使用URL的openConnection()方法来获得。

例如,要创建一个http://www.baidu.com 网站对应的HttpURLConnection对象,可以使用下列代码:

URL url=new URL("http://www.baidu.com");
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();

注:上述代码通过openConnection()方法创建的HttpURLConnection对象,并没有真正执行连接操作,只是创建了一个新的实例,在进行连接前,还可以设置一些属性。

例如,连接超时的时间和请求方式等,代码如下:

urlConnection.setConnectTimeout(5000);//设置连接超时时间为5秒
urlConnection.setRequestMethod("GET");//设置连接的方式为get方式

创建了HttpURLConnection对象后,就可以使用该对象发送HTTP请求了。

2.在编写我们的Android项目之前,先做下面几个步骤:

(1).开启Tomcat服务器,如下图所示:

(2).把我们所需要的Web项目部署到Tomcat服务器上,也可以将我们Web项目复制到tomcat服务器的安装目录下的webapps目录底下,即可,如下图所示:

(3).这个Android项目要访问的为music项目,打开此项目,如下图所示:

其中我们Android要访问的为image文件夹下的一张图片,和music项目底下的index.jsp文件,即查看此网络图片和网络源码。

(4).最后,我们必须要知道当前网络的IP地址,因为我们访问的为Windows系统下的tomcat服务器的Web项目,而Android系统的内核为Linux,系统不一样,所以我们在windows系统下访问Web‘项目,可以直接输入http://localhost:8083/music/index.jsp 或者http://127.0.0.1:8083/music/index.jsp 以及http://192.168.91.1:8083/music/index.jsp
,而Android访问Web项目只可以通过http://192.168.91.1:8083/music/index.jsp 所以,先查看我们的IP地址,打开命令行窗口,输入ipconfig命令,即可查看,如下图所示:

其中查看到的IPv4地址即为IP地址。

3.接下来就可以编写我们的Android项目了,此Android项目用来查看网络图片和网络源码,新建Android项目,项目名为android_net,主要项目结构如下:

(1).首先,打开我们的activity_main.xml布局文件,此布局文件只放置两个按钮,点击不同的按钮跳转到不同的Activity,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/net_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查看网络图片" />

    <Button
        android:id="@+id/net_code"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查看网络源码" />

</LinearLayout>

(2).打开MainActivity.java文件,此类用来点击按钮跳转不同的Activity,代码如下:

package com.android.android_net;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private Button net_image,net_code;//声明Button对象
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/* 获取布局管理器中的两个Button控件 */
		net_image=(Button)findViewById(R.id.net_image);
		net_code=(Button)findViewById(R.id.net_code);

		/* 分别添加按钮点击监听事件 */
		net_image.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent=new Intent(MainActivity.this,ShowNetImageActivity.class);//实例化Intent对象
				startActivity(intent);//开启此Activity,跳转到ShowNetImageActivity类
			}
		});

		net_code.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent=new Intent(MainActivity.this,ShowNetCodeActivity.class);//实例化Intent对象
				startActivity(intent);//开启此Activity,跳转到ShowNetCodeActivity类
			}
		});
	}
}

(3).接下来在layout目录下新建一个activity_image.xml文件,用来显示网络的图片,主要代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

	<TextView
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="网络图片路径"
	    android:padding="5dp"/>

	<EditText
	    android:id="@+id/imagePath_et"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="http://192.168.91.1:8083/music/image/mm4.jpg"/>

	<Button
	    android:id="@+id/show_netimage"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="查看网络图片"/>

	<ImageView
	    android:id="@+id/imageView"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:src="@drawable/ic_launcher"/>
</LinearLayout>

(4).接着,在com.android.android_net包下新建一个ShowNetImageActivity类,其中开启了一个新线程来调用ImageService的getImage()方法,这样才能避免网络主线程异常,代码如下:

package com.android.android_net;

import com.android.service.ImageService;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class ShowNetImageActivity extends Activity {

	private EditText imagePath_et;//声明EditText对象,即图片路径输入框
	private Button show_netimage;//声明Button对象
	private ImageView imageView;//声明ImageView对象
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_image);
		/* 获取布局管理器的各个控件 */
		imagePath_et=(EditText)findViewById(R.id.imagePath_et);
		show_netimage=(Button)findViewById(R.id.show_netimage);
		imageView=(ImageView)findViewById(R.id.imageView);

		//为按钮点击添加事件监听器
		show_netimage.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				final String imagePath=imagePath_et.getText().toString();//获取图片路径
				//新建一个线程
				new Thread(new Runnable(){

					@Override
					public void run() {
						// TODO Auto-generated method stub
						try {
							byte[] data=ImageService.getImage(imagePath);//调用ImageService类的getImage()方法,返回字节数组
							final Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);//创建一个Bitmap对象
							imageView.post(new Runnable() {

								@Override
								public void run() {
									// TODO Auto-generated method stub
									imageView.setImageBitmap(bitmap);//设置显示的图片
								}
							});
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}

				}).start();//开启线程
			}
		});
	}

}

(5).接着,主要的一个ImageService类,在com.android.service包下,用来返回网络图片的数据,代码如下:

package com.android.service;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class ImageService {

	public static byte[] getImage(String imagePath) throws Exception {
		// TODO Auto-generated method stub
		URL url=new URL(imagePath);//实例化URL对象url
		HttpURLConnection connection=(HttpURLConnection) url.openConnection();//实例化HttpURLConnection对象connection
		connection.setConnectTimeout(5000);//设置连接超时时间为5秒
		connection.setRequestMethod("GET");//设置请求方法为get方式
		int code=connection.getResponseCode();//获取状态码
		//如果状态码请求成功的话,即code等于HttpURLConnection.HTTP_OK,也可以写成code==200
		if(code==HttpURLConnection.HTTP_OK){
			InputStream inputStream=connection.getInputStream();//获得输入流,返回一个InputStream对象
			ByteArrayOutputStream outputStream=new ByteArrayOutputStream();//实例化一个字节数组输出输入流对象
			byte[] buffer=new byte[1024];//实例化一个字节数组对象
			int len=0;//定义一个变量,初始值为0
			//当获取到的输入流有数据时,循环写入数据
			while((len=inputStream.read(buffer))!=-1){
				outputStream.write(buffer, 0, len);//写入数据
			}
			inputStream.close();//关闭输入流
			return outputStream.toByteArray();//返回数据字节数组
	}
		return null;
	}
}
		

(6).接着在layout目录下新建一个activity_code.xml文件,用来显示网络源码,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="网络图片路径:" />

    <EditText
        android:id="@+id/codePath_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="http://192.168.91.1:8083/music/index.jsp" />

    <Button
        android:id="@+id/show_netcode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查看网络源码" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="哈哈..." />
    </ScrollView>

</LinearLayout>

(7).在com.android.android_net包下新建一个ShowNetCodeActivity类,其中开启了一个新线程,使用Handler消息机制来显示我们的网络源码,其中新建线程中调用了CodeService类的getCode()方法,来获取网络源码,ShowNetCodeActivity类代码如下:

package com.android.android_net;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.android.service.CodeService;

public class ShowNetCodeActivity extends Activity {

	private EditText codePath_et;//声明EditText对象
	private Button show_netcode;//声明Button对象
	private TextView textView;//声明textView对象
	private String result="";//初始化一个空的String类型变量
	private Handler handler;//声明一个Handler对象
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_code);
		/* 获取布局管理器中的各个控件 */
		codePath_et=(EditText)findViewById(R.id.codePath_et);
		show_netcode=(Button)findViewById(R.id.show_netcode);
		textView=(TextView)findViewById(R.id.textView);

		//为按钮点击添加监听事件
		show_netcode.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				final String codePath=codePath_et.getText().toString();//获取网络源码的路径
				//新建一个线程
				new Thread(new Runnable() {

					@Override
					public void run() {
						// TODO Auto-generated method stub
						try {
							result=CodeService.getCode(codePath);//调用CodeSErvice类的getCode方法,返回字符串数据
							Message msg=handler.obtainMessage();//通过handler对象获得Message消息
							handler.sendMessage(msg);//发送消息
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}).start();//开启一个线程		

				//实例化一个Handler对象
				handler=new Handler(){

					@Override
					public void handleMessage(Message msg) {
						// TODO Auto-generated method stub
						if(result!=null){
							textView.setText(result);//设置文本视图显示的文本
						}
						super.handleMessage(msg);
					}

				};
			}
		});
	}

}

(8).下面,在com.android.service包下新建一个CodeService类,用来获取网络源码,代码如下:

package com.android.service;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class CodeService {

	public static String getCode(String codePath) throws Exception {
		// TODO Auto-generated method stub
		URL url=new URL(codePath);//实例化一个URL对象
		HttpURLConnection connection=(HttpURLConnection) url.openConnection();//实例化一个HttpURLConnection对象
		connection.setConnectTimeout(5000);//设置连接超时时间为5秒
		connection.setRequestMethod("GET");//设置连接的方式为get方式
		int code=connection.getResponseCode();//获取状态码
		//如果请求成功的话
		if(code==200){
			InputStream inputStream=connection.getInputStream();//获取输入流,返回InputStream对象
			ByteArrayOutputStream outputStream=new ByteArrayOutputStream();//实例化一个ByteArrayOutputStream对象
			byte[] buffer=new byte[1024];//实例化一个字节数组对象
			int len=0;//定义一个变量,初始值为0
			//当获取到的输入流有数据时,循环写入数据
			while((len=inputStream.read(buffer))!=-1){
				outputStream.write(buffer, 0, len);//写入数据
			}
			inputStream.close();//关闭输入流
			byte[] data=outputStream.toByteArray();//获得字节数组
			String result=new String(data, "UTF-8");//通过获取到的字节数组数据实例化一个String对象,编码格式为UTF-8
			return result;//返回写入的数据
		}
		return null;
	}

}

(9).最后,千万要记得在AndroidManifest.xml文件添加访问网络的权限,以及那两个Activity,代码如下:

添加访问网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

声明另外两个activity:

 <activity android:name="com.android.android_net.ShowNetImageActivity"/>
 <activity android:name="com.android.android_net.ShowNetCodeActivity"/>

4.部署我们的项目到Android模拟器上,效果如下:

(1).点击查看网络图片按钮,跳转到ShowNetImageActivity,如下图所示:

点击上图的按钮,如下图:

获取到tomcat服务器上的图片。

(2).如果点击刚开始运行的那个查看网络源码的按钮,将跳转到ShowNetCodeActivity,如下图所示:

点击网络源码按钮,如下图:

这样便获取到网络的源码了。

注:其中要注意的一点是 我们访问网络文件的源码时,要注意网络jsp文件和获取到的字符串的编码问题,否则会出现中文乱码问题。

5.以上内容仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!

源码下载地址:http://download.csdn.net/download/u012561176/9054209



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 17:23:02

Android之使用HttpURLConnection类查看网络图片以及网络源码的相关文章

Android ViewGroup触摸屏事件派发机制详解与源码分析

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 该篇承接上一篇<Android View触摸屏事件派发机制详解与源码分析>,阅读本篇之前建议先阅读. 1 背景 还记得前一篇<Android View触摸屏事件派发机制详解与源码分析>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事

Android Volley完全解析(四),带你从源码的角度理解Volley

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了,但是对于Volley的工作原理,恐怕有很多朋友还不是很清楚.因此,本篇文章中我们就来一起阅读一下Volley的源码,将它的工作流程整体地梳理一遍.同时,这也是Volley系列的最后一篇文章了. 其实,Volley的官方文档中本身就附有了一张Volley的工作流程图,如下图所示. 多数朋友突然看到一张这样

Android布局文件的加载过程分析:Activity.setContentView()源码分析

大家都知道在Activity的onCreate()中调用Activity.setContent()方法可以加载布局文件以设置该Activity的显示界面.本文将从setContentView()的源码谈起,分析布局文件加载所涉及到的调用链.本文所用的源码为android-19. Step 1  .Activity.setContentView(intresId) public void setContentView(int layoutResID) { getWindow().setConten

Android多线程研究(1)——线程基础及源码剖析

从今天起我们来看一下Android中的多线程的知识,Android入门容易,但是要完成一个完善的产品却不容易,让我们从线程开始一步步深入Android内部. 一.线程基础回顾 package com.maso.test; public class TraditionalThread { public static void main(String[] args) { /* * 线程的第一种创建方式 */ Thread thread1 = new Thread(){ @Override publi

非常经典的飞行射击类游戏飞离神庙源码

该游戏源码实现了一款很不错的飞行射击类游戏,飞离神庙游戏,游戏的操作玩法简单,跟我们平时生活中玩的一下射击类的游戏玩法差不多,喜欢android游戏开发的朋友可以下载吧. 源码下载:http://code.662p.com/view/2267.html 详细说明:http://android.662p.com/thread-4584-1-1.html

【小白的java成长系列】——String类的深入分析(基于源码)

接着前面面向对象来说吧~今天来说说String类..其实String类也包含很多面向对象的知识的~ 首先来问一个问题:我们在开发过程中,如果要使用一个类的话,就要创建对象,这句话没什么问题吧~在实际开发的时候确实是这样的,只有创建了对象才能真正的去使用一个普通的类,我们一般创建对象,几乎所有的类创建对象都是要通过new关键字来创建的~ 问题就来了..为什么我们的String可以直接写成String str = "abc";这样子呢? 当然String类也可以通过new来创建对象的...

Android开发之自己定义TabHost文字及背景(源码分享)

使用TabHost 能够在一个屏幕间进行不同版面的切换,而系统自带的tabhost界面较为朴素,我们应该怎样进行自己定义改动优化呢 MainActivity的源码 package com.dream.ledong; import android.app.TabActivity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.Gr

Android App 启动时显示正在加载图片(源码)

微信.QQ.天天动听等程序,在打开时显示了一张图片,然后跳转到相关界面.本文实现这个功能,其实很简单.... 新建两个Activity,LoadingActivity,MainActivity,将LoadingActivity设置为android.intent.action.MAIN.使用TimerTesk,或者Thread将LoadingActivity显示几秒后跳转到MainActivity界面. LoadingActivity: new Timer().schedule(new Timer

spring启动component-scan类扫描加载过程---源码分析

有朋友最近问到了 spring 加载类的过程,尤其是基于 annotation 注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,中途会穿插自己通过newClassPathXmlApplicationContext 的区别和联系.