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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值