这两天因为项目需要,和后台服务器打交道比较多,包括向服务器端发送数据,接收来自服务器端的数据,所以会用到一些网络操作相关的知识,接下来就简单总结下Http网络操作的相关知识,并记录在实际操作过程中遇到的一些错误,方便以后总结复习
Android中网络操作的方式主要是Scoket方式和Http方式,关于Scoket方式和http方式的比较,见服务器和客户端的交互方式(Socket,http协议)和各自特点和适用范围
通过Http协议实现网络操作有两种选择:
使用java的标准库URLConnection(java.net.URLConnection)中的HttpURLConnection:
使用apache 的开源框架httpClient(org.apache.http.client),HttpClient是基于URLConnection的一个封装,增加了很多方便使用的API。
下面是整理的结构图:
通过HttpURLConnection实现网络操作
使用GET方法的实例
1.新建一个Android项目, 在AndroidManifest.xml文件中添加网络操作相关权限:
<uses-permission android:name="android.permission.INTERNET"/>
2.在MainActivity.java中创建一个String类型常量myURL用于存放URL地址:
private final String myURL="http://www.ibookpa.com/mobileFilter?action=login";
这里的URL地址,就根据自己的实际情况来写,我这里使用的是他们写好的一个地址,用于传输一个json格式数据,用浏览器打开这个链接的效果如下:
也就是说我通过这个URL链接,将获取到这一串json数据
3.新建一个线程类重写其run方法
这里需要注意的是,Android中所有的网络操作都不能直接在MainThread中进行,必须在其他线程中执行网络相关操作:
private class myThread extends Thread {
@Override
public void run() {
super.run();
}
}
4.在run方法中新建URL类的对象
传入一个字符串类型参数,这里的参数可以是定义好的URL地址,也可以是构造出来的地址,灵活性很大,本例中是使用定义好的URL地址:myURL
private class myThread extends Thread {
@Override
public void run() {
super.run();
try {
URL url = new URL(myURL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
5.创建HttpURLConnection类的对象,用于获取通过URL得到的网络连接:
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
6.通过inputStream得到输入流
可以有很多方式,这里使用BufferedReader来获取输入流:
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
7.接下来就是获取输入流
通过循环读取BufferedReader中的内容,来赋值给一个String类型的变量,就能实现获取输入流中的String类型数据:
String result = "";
String res = null;
while ((res = br.readLine()) != null) {
result += res;
}
System.out.println("-->result : " + result);
8. 最后,记得关闭BufferedReader,InputStream和HttpURLConnection:
br.close();
is.close();
conn.disconnect();
9. 最最后,在onCreate()方法中实例化线程类,并运行:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new myThread().start();
}
以上,完整代码如下:
package com.example.urlconnection_test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
private final String myURL = "http://www.ibookpa.com/mobileFilter?action=login";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new myThread().start();//启动线程,进行网络操作
}
private