android post 方式 访问网络 实例

  • android post 方式 访问网络 实例 

因为Android4.0之后对使用网络有特殊要求,已经无法再在主线程中访问网络了,必须使用多线程访问的模式

该实例需要在android配置文件中添加 网络访问权限 

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

android版本 最低API 

  <uses-sdk  android:minSdkVersion="9"  android:targetSdkVersion="17" />

package com.app.urltest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	TextView textView;
	// 网络地址
	String urlPath = "http://webservice.webxml.com.cn/WebServices/TrainTimeWebService.asmx"
			+ "/getStationAndTimeByStationName";
	// 请求参数
	String requestStr = "StartStation=北京&ArriveStation=上海&UserID=";
	/*
	 * 网络连接 讲uripath 转换成URL对象 连接请求 需用 URL对象的openConnection
	 * 方法得到一个连接对象httpUrlConnection 设置请求参数: 超时 请求方式 读写 内容类型 长度 ... 发送请求参数:得到输出流
	 * 吧请求参数写到输出流 服务器响应: 从响应 (输入)流中得到 数据 需用ANdroidManifest中添加 访问网络权限
	 */
	public String connectNework() {

		try {
			// 创建URL
			URL url = new URL(urlPath);
			// 获得连接
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			// 设置请求参数
			connection.setReadTimeout(3000);// 超时
			connection.setRequestMethod("POST");// 请求方式
			connection.setDoInput(true);// 可读写
			connection.setDoOutput(true);
			connection.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");// 设置请求 参数类型
			byte[] sendData = requestStr.getBytes("UTF-8");// 将请求字符串转成UTF-8格式的字节数组
			connection.setRequestProperty("Content-Length", sendData.length
					+ "");// 请求参数的长度

			OutputStream outputStream = connection.getOutputStream();// 得到输出流对象
			outputStream.write(sendData);// 发送写入数据
			
			/*//获得 服务器响应代码
			int code = connection.getResponseCode();
			if(code==20){
				//获取数据
			}
*/
			// 响应
			InputStream inputStream = connection.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(
					inputStream);
			BufferedReader bReader = new BufferedReader(inputStreamReader);
			String str = "";
			String temp = "";
			while ((temp = bReader.readLine()) != null) {
				str = str + temp + "
";
			}
			return str;// 返回响应数据

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
		.detectAll() 
		.penaltyLog() 
		.penaltyDialog() ////打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
		.build()); 
		StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() 
				.penaltyLog() 
				.build()); 
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView) findViewById(R.id.textView1); 
		new Thread(runnable).start();  

	}
	String text;
	//使用Handler 对象更新主UI
	Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) { 
			/*方式二: 使用Bundle接收数据
			 * Bundle data = new Bundle()
			 * String text =data.getString("s",s);
			 * 
			 */
			//显示到控件
			textView.setText(text);
		
		};
	};
	Runnable runnable  = new Runnable() { 

		@Override
		public void run() {
			//连接网络请求
			text = connectNework();
			Message msg = new Message();
			/* 使用Bundle对象 传送数据
			 * Bundle data = new Bundle();
			 * data.putString("s",s);
			 * msg.setData(data);
			 * 
			 */
			handler.sendMessage(msg); 
		}
	};
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}


}

  • Apche接口实现 访问网络
Apche HttpClient 是一个开源项目,从名字上就可以看出,它是一个简单的HTTP客户端(并不是浏览器),可以发送HTTP请求,接受HTTP响应。但是不会缓存服务器的响应,不能执行HTTP页面中签入嵌入的JS代码,自然也不会对页面内容进行任何解析、处理,这些都是需要开发人员来完成的。
  现在Android已经成功集成了HttpClient,所以开发人员在Android项目中可以直接使用HttpClient来想Web站点提交请求以及接受响应,如果使用其他的Java项目,需要引入进相应的Jar包。HttpClient可以在官网上下载:http://hc.apache.org/downloads.cgi
下面来看一个简单的应用 访问网络的例子.

package com.app.apachehttpclient;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
				.detectAll().penaltyLog().penaltyDialog() // //打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
				.build());
		StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
				.penaltyLog().build());
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		String url_service = "http://webservice.webxml.com.cn/WebServices/TrainTimeWebService.asmx"
				+ "/getStationAndTimeByStationName";
		// 创建一个请求
		HttpPost httpPost = new HttpPost(url_service);
		List params = new ArrayList();
		// 设置参数
		params.add(new BasicNameValuePair("StartStation", "北京"));// 始发站
		params.add(new BasicNameValuePair("ArriveStation", "上海"));// 到达站
		params.add(new BasicNameValuePair("UserID", ""));// 用户ID
		try {
			// 设置编码
			httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
			// 发送请求 并获得反馈
			HttpClient httpClient = new DefaultHttpClient();
			HttpResponse httpResponse = httpClient.execute(httpPost);
			// 解析返回的数据
			if (httpResponse.getStatusLine().getStatusCode() != 404) {//判断服务器状态
				String result = EntityUtils.toString(httpResponse.getEntity());
				System.out.println(result);
				// 显示到控件
				TextView textView1 = (TextView) findViewById(R.id.textView1);
				textView1.setText(result);
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
原文地址:https://www.cnblogs.com/aikongmeng/p/3697400.html