android网络通信方式总结
1995年1G问世,手机只能进行基本的语音通讯,1996-1997年2G(GSM,CDMA)及其后的GPRS,EDGE等技术的快速发展,手机开始逐渐增加了数据服务功能。2009年开始,3G在全世界开始大规模布置以及苹果创造性开发新型苹果手机。手机慢慢的变成互联网的终端,从而带动了一个新的时代--移动互联网时代。因此现代手机通常都支持这些常用网络设备,如WIFI,NFC,蓝牙等。
在Android中几种网络编程的方式:
1、针对TCP/IP的Socket、ServerSocket
TCP/IP是一种协议,是一种面向连接的、可靠的协议。Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。
示例代码:
(1)android客户端
<span style="color:#444444;">import java.io.*; </span><span style="color:#ff0000;">import java.net.Socket;</span><span style="color:#444444;"> import java.net.UnknownHostException; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; //客户端的实现 public class TestSocket extends Activity { private TextView text1; private Button but1; private EditText edit1; private final String DEBUG_TAG="mySocketAct"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text1=(TextView)findViewById(R.id.text1); but1=(Button)findViewById(R.id.but1); edit1=(EditText)findViewById(R.id.edit); but1.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { Socket socket=null; String mesg=edit1.getText().toString()+"\r\n"; edit1.setText(""); Log.e("dddd", "sent id"); try { socket=new Socket("172.22.122.1",54321); //向服务器发送信息 PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); out.println(mesg); //接受服务器的信息 BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String mstr=br.readLine(); if(mstr!=null) { text1.setText(mstr); }else { text1.setText("数据错误"); } </span><span style="color:#ff0000;">out.close(); br.close(); socket.close();</span><span style="color:#444444;"> } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch(Exception e) { Log.e(DEBUG_TAG,e.toString()); } } }); } }</span>(2)服务端代码
<span style="color:#444444;">import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class AndroidServer implements Runnable{ public void run() { try { ServerSocket serverSocket=new ServerSocket(54321); while(true) { System.out.println("等待接收用户连接:"); //接受客户端请求 Socket client=serverSocket.accept(); try { //接受客户端信息 BufferedReader in=new</span><span style="color:#ff0000;"> BufferedReader</span><span style="color:#444444;">(new InputStreamReader(client.</span><span style="color:#ff0000;">getInputStream</span><span style="color:#444444;">())); String str=in.readLine(); System.out.println("read: "+str); //向客户端发送消息 </span><span style="color:#ff0000;">PrintWriter</span><span style="color:#444444;"> out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.</span><span style="color:#ff0000;">getOutputStream</span><span style="color:#444444;">())),true); out.println("return "+str); in.close(); out.close(); }catch(Exception ex) { System.out.println(ex.getMessage()); ex.printStackTrace(); } finally { </span><span style="color:#ff0000;">client.close();</span><span style="color:#444444;"> System.out.println("close"); } } } catch (IOException e) { System.out.println(e.getMessage()); } } public static void main(String [] args) { Thread desktopServerThread=new Thread(new AndroidServer()); desktopServerThread.start(); } }</span>
2、针对UDP的DatagramSocket、DatagramPackage。
对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。
示例代码:
(1)客户端代码
<pre name="code" class="java">public class TestClient { static DatagramSocket socket; public TestClient() { // TODO Auto-generated constructor stub } /** * * @param ip * ip地址 * @param port * 端口 * @param str * 发送的内容 */ public static String clientUDP(String ip, int port, String str) { String result = null; while (true) { try { byte[] outputData = str.getBytes(); // UDP socket 数据发送 socket = new DatagramSocket(); DatagramPacket outputPacket = new DatagramPacket(outputData, outputData.length, InetAddress.getByName(ip), port); socket.send(outputPacket); // udp 数据读取 DatagramPacket inputPacket = new DatagramPacket(new byte[512], 512); socket.receive(inputPacket); System.out.println(new String(inputPacket.getData(), 0, inputPacket.getLength())); result = new String(inputPacket.getData(), 0, inputPacket.getLength()); } catch (Exception e) { e.printStackTrace(); } if (socket != null) { socket.close(); } return result; } } }
(2)服务端代码
package server; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.text.SimpleDateFormat; import java.util.Date; public class UDPServer{ public static void main(String[] args) throws Exception{ DatagramSocket udpSocket = new DatagramSocket(8080); while(true){ try{ // UDP数据读取 DatagramPacket packet = new DatagramPacket(new byte[512],512); udpSocket.receive(packet); String msg = new String(packet.getData(), 0,packet.getLength()); System.out.println(msg); if(msg.equals("exit")){ break; } // UDP数据发送 SimpleDateFormat f = new SimpleDateFormat("MMM dd,yyyy kk:mm:ss"); String time = "现在的时间是:" + f.format(new Date()); System.out.println(time ); packet.setData(time.getBytes()); udpSocket.send(packet); }catch(Exception e){ e.printStackTrace(); } } udpSocket.close(); } }
3、针对直接URL的HttpURLConnection
(1)GET方式
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.apache.http.message.BasicNameValuePair; public class HttpUtils { private static String URL_PATH = "http://192.168.0.102:8080/myhttptest/pro1.png"; public HttpUtils() { // TODO Auto-generated constructor stub } public static void saveImageToDisk() { InputStream inputStream = getInputStream(); byte[] data = new byte[1024]; int len = 0; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("C:\\test.png"); while ((len = inputStream.read(data)) != -1) { fileOutputStream.write(data, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 获得服务器端的数据,以InputStream形式返回 * @return */ public static InputStream getInputStream() { InputStream inputStream = null; HttpURLConnection httpURLConnection = null; try { URL url = new URL(URL_PATH); if (url != null) { httpURLConnection = (HttpURLConnection) url.openConnection(); // 设置连接网络的超时时间 httpURLConnection.setConnectTimeout(3000); httpURLConnection.setDoInput(true); // 表示设置本次http请求使用GET方式请求 httpURLConnection.setRequestMethod("GET"); int responseCode = httpURLConnection.getResponseCode(); if (responseCode == 200) { // 从服务器获得一个输入流 inputStream = httpURLConnection.getInputStream(); } } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return inputStream; } public static void main(String[] args) { // 从服务器获得图片保存到本地 saveImageToDisk(); } }
(2)POST方式
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; public class HttpUtils { // 请求服务器端的url private static String PATH = "http://192.168.0.102:8080/myhttptest/servlet/LoginAction"; private static URL url; public HttpUtils() { // TODO Auto-generated constructor stub } static { try { url = new URL(PATH); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param params * 填写的url的参数 * @param encode * 字节编码 * @return */ public static String sendPostMessage(Map<String, String> params, String encode) { // 作为StringBuffer初始化的字符串 StringBuffer buffer = new StringBuffer(); try { if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { // 完成转码操作 buffer.append(entry.getKey()).append("=").append( URLEncoder.encode(entry.getValue(), encode)) .append("&"); } buffer.deleteCharAt(buffer.length() - 1); } // System.out.println(buffer.toString()); // 删除掉最有一个& System.out.println("-->>"+buffer.toString()); HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); urlConnection.setConnectTimeout(3000); urlConnection.setRequestMethod("POST"); urlConnection.setDoInput(true);// 表示从服务器获取数据 urlConnection.setDoOutput(true);// 表示向服务器写数据 // 获得上传信息的字节大小以及长度 byte[] mydata = buffer.toString().getBytes(); // 表示设置请求体的类型是文本类型 urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty("Content-Length", String.valueOf(mydata.length)); // 获得输出流,向服务器输出数据 OutputStream outputStream = urlConnection.getOutputStream(); outputStream.write(mydata,0,mydata.length); outputStream.close(); // 获得服务器响应的结果和状态码 int responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { return changeInputStream(urlConnection.getInputStream(), encode); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } /** * 将一个输入流转换成指定编码的字符串 * * @param inputStream * @param encode * @return */ private static String changeInputStream(InputStream inputStream, String encode) { // TODO Auto-generated method stub ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; String result = ""; if (inputStream != null) { try { while ((len = inputStream.read(data)) != -1) { outputStream.write(data, 0, len); } result = new String(outputStream.toByteArray(), encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return result; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Map<String, String> params = new HashMap<String, String>(); params.put("username", "admin"); params.put("password", "1234"); String result = HttpUtils.sendPostMessage(params, "utf-8"); System.out.println("--result->>" + result); } }
(3)HttpClient
import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; 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; public class HttpUtils { public HttpUtils() { // TODO Auto-generated constructor stub } public static String sendHttpClientPost(String path, Map<String, String> map, String encode) { List<NameValuePair> list = new ArrayList<NameValuePair>(); if (map != null && !map.isEmpty()) { for (Map.Entry<String, String> entry : map.entrySet()) { list.add(new BasicNameValuePair(entry.getKey(), entry .getValue())); } } try { // 实现将请求的参数封装到表单中,请求体重 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode); // 使用Post方式提交数据 HttpPost httpPost = new HttpPost(path); httpPost.setEntity(entity); // 指定post请求 DefaultHttpClient client = new DefaultHttpClient(); HttpResponse httpResponse = client.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { return changeInputStream(httpResponse.getEntity().getContent(), encode); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } /** * 将一个输入流转换成指定编码的字符串 * * @param inputStream * @param encode * @return */ public static String changeInputStream(InputStream inputStream, String encode) { // TODO Auto-generated method stub ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; String result = ""; if (inputStream != null) { try { while ((len = inputStream.read(data)) != -1) { outputStream.write(data, 0, len); } result = new String(outputStream.toByteArray(), encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return result; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String path = "http://192.168.0.102:8080/myhttp/servlet/LoginAction"; Map<String, String> params = new HashMap<String, String>(); params.put("username", "admin"); params.put("password", "123"); String result = HttpUtils.sendHttpClientPost(path, params, "utf-8"); System.out.println("-->>"+result); } }
4、使用Web Service。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice
<span style="color:#444444;">import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.AndroidHttpTransport; import org.xmlpull.v1.XmlPullParserException; import android.util.Log; /** * 在这个帮助类中,根据文档说明和URL地址 * 先获取支持的省份信息 * 再根据某一个省份获取城市信息 * 再根据城市信息获取天气情况 * * */ public class </span><span style="color:#ff0000;">WebServiceHelper</span><span style="color:#444444;"> { public static final String TAG = "WebServiceHelper"; // WSDL文档中的命名空间 private static final String targetNameSpace = "http://WebXml.com.cn/"; // WSDL文档中的URL private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl"; // 需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息) private static final String getSupportProvince = "getSupportProvince"; // 需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数) private static final String getSupportCity = "getSupportCity"; // 根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数 private static final String getWeatherbyCityName = "getWeatherbyCityName"; /** * 根据最新的文档,接口好像变了。。。囧 * 获得州,国内外省份和城市信息 * @return */ public List<String> getProvince() { List<String> provinces = new ArrayList<String>(); SoapObject soapObject = new SoapObject(targetNameSpace, getSupportProvince); // request.addProperty("参数", "参数值");调用的方法参数与参数值(根据具体需要可选可不选) SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); // envelope.bodyOut=request; AndroidHttpTransport httpTranstation = new AndroidHttpTransport(WSDL); // 或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL); try { httpTranstation.call(targetNameSpace + getSupportProvince, envelope); Log.i(TAG, targetNameSpace + getSupportProvince); SoapObject result = (SoapObject) envelope.getResponse(); // 下面对结果进行解析,结构类似json对象 Log.i(TAG, ""+result.getPropertyCount()); int count = result.getPropertyCount(); for (int index = 0; index < count; index++) { provinces.add(result.getProperty(index).toString()); } } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } return provinces; } /** * 根据省份或者直辖市获取天气预报所支持的城市集合 * 比如内蒙古-->【赤峰市、呼市、包头等。。。】 * @param province * @return */ public List<String> getCitys(String province) { List<String> citys = new ArrayList<String>(); SoapObject soapObject = new SoapObject(targetNameSpace, getSupportCity); soapObject.addProperty("byProvinceName", province); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); AndroidHttpTransport httpTransport = new AndroidHttpTransport(WSDL); try { httpTransport.call(targetNameSpace + getSupportCity, envelope); SoapObject result = (SoapObject) envelope.getResponse(); int count = result.getPropertyCount(); for (int index = 0; index < count; index++) { citys.add(result.getProperty(index).toString()); } } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } return citys; } /** * 根据城市信息获取天气预报信息 * @param city * @return **/ @SuppressWarnings("deprecation") public WeatherBean getWeatherByCity(String city) { WeatherBean bean = new WeatherBean(); SoapObject soapObject = new SoapObject(targetNameSpace, getWeatherbyCityName); city = city.substring(0,city.length()-7); Log.i(TAG, "city="+city); soapObject.addProperty("theCityName", city); // 调用的方法参数与参数值(根据具体需要可选可不选) SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); envelope.bodyOut = soapObject; AndroidHttpTransport httpTranstation = new AndroidHttpTransport(WSDL); // 或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL); httpTranstation.debug = true; try { httpTranstation.call(targetNameSpace + getWeatherbyCityName, envelope); SoapObject result = (SoapObject) envelope.getResponse(); if(result != null){ Log.i(TAG, "result = " + result); // 下面对结果进行解析,结构类似json对象 bean = parserWeather(result); }else{ Log.i(TAG, "result = null"); } } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } return bean; } /** * 测试用:根据城市名称获取天气情况 * @param city */ public void getWeatherByCityTest(String city){ try { SoapObject msg = new SoapObject( "http://WebXml.com.cn/", "getWeatherbyCityName"); city = city.substring(0,city.length()-7); Log.i(TAG, "city="+city); msg.addProperty("theCityName", city); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = msg; envelope.dotNet = true; AndroidHttpTransport sendRequest = new AndroidHttpTransport( "http://www.webxml.com.cn/webservices/weatherwebservice.asmx"); envelope.setOutputSoapObject(msg); sendRequest .call("http://WebXml.com.cn/getWeatherbyCityName", envelope); SoapObject result = (SoapObject) envelope.bodyIn; SoapObject detail = (SoapObject) result .getProperty("getWeatherbyCityNameResult"); System.out.println(detail + ""); } catch (Exception e) { e.printStackTrace(); } } /** * 测试用 * @param detail */ private void parseWeather(SoapObject detail) { String weatherToday = null,weatherTomorrow = null,weatherAfterday = null; int iconToday[] = null,iconTomorrow[] = null,iconAfterday[] = null; // String date = detail.getProperty(6).toString(); // String weatherToday = "今天:" + date.split(" ")[0]; // Log.i(TAG, weatherToday); // weatherToday = weatherToday + "\n天气:" + date.split(" ")[1]; weatherToday = weatherToday + "\n气温:" + detail.getProperty(5).toString(); weatherToday = weatherToday + "\n风力:" + detail.getProperty(7).toString() + "\n"; Log.i(TAG, weatherToday); iconToday[0] = parseIcon(detail.getProperty(8).toString()); iconToday[1] = parseIcon(detail.getProperty(9).toString()); String weatherCurrent = detail.getProperty(10).toString(); // date = detail.getProperty(13).toString(); // String weatherTomorrow = "明天:" + date.split(" ")[0]; // weatherTomorrow = weatherTomorrow + "\n天气:" + date.split(" ")[1]; weatherTomorrow = weatherTomorrow + "\n气温:" + detail.getProperty(12).toString(); weatherTomorrow = weatherTomorrow + "\n风力:" + detail.getProperty(14).toString() + "\n"; iconTomorrow[0] = parseIcon(detail.getProperty(15).toString()); iconTomorrow[1] = parseIcon(detail.getProperty(16).toString()); // date = detail.getProperty(18).toString(); // String weatherAfterday = "后天:" + date.split(" ")[0]; // weatherAfterday = weatherAfterday + "\n天气:" + date.split(" ")[1]; weatherAfterday = weatherAfterday + "\n气温:" + detail.getProperty(17).toString(); weatherAfterday = weatherAfterday + "\n风力:" + detail.getProperty(19).toString() + "\n"; iconAfterday[0] = parseIcon(detail.getProperty(20).toString()); iconAfterday[1] = parseIcon(detail.getProperty(21).toString()); } /** * 解析返回的结果 * @param soapObject **/ protected WeatherBean parserWeather(SoapObject soapObject) { WeatherBean bean = new WeatherBean(); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); List<Integer> icons = new ArrayList<Integer>(); // 城市名 bean.setCityName(soapObject.getProperty(1).toString()); // 城市简介 bean.setCityDescription(soapObject.getProperty( soapObject.getPropertyCount() - 1).toString()); // 天气实况+建议 bean.setLiveWeather(soapObject.getProperty(10).toString() + "\n" + soapObject.getProperty(11).toString()); // 其他数据 //日期, String date = soapObject.getProperty(6).toString(); Log.i(TAG, ""); // --------------------------------------------------- String weatherToday = "今天:" + date.split(" ")[0]; weatherToday += "\n天气:" + date.split(" ")[1]; weatherToday += "\n气温:" + soapObject.getProperty(5).toString(); weatherToday += "\n风力:" + soapObject.getProperty(7).toString(); weatherToday += "\n"; icons.add(parseIcon(soapObject.getProperty(8).toString())); icons.add(parseIcon(soapObject.getProperty(9).toString())); map.put("weatherDay", weatherToday); map.put("icons", icons); list.add(map); // ------------------------------------------------- map = new HashMap<String, Object>(); date = soapObject.getProperty(13).toString(); String weatherTomorrow = "明天:" + date.split(" ")[0]; weatherTomorrow += "\n天气:" + date.split(" ")[1]; weatherTomorrow += "\n气温:" + soapObject.getProperty(12).toString(); weatherTomorrow += "\n风力:" + soapObject.getProperty(14).toString(); weatherTomorrow += "\n"; icons = new ArrayList<Integer>(); icons.add(parseIcon(soapObject.getProperty(15).toString())); icons.add(parseIcon(soapObject.getProperty(16).toString())); map.put("weatherDay", weatherTomorrow); map.put("icons", icons); list.add(map); // -------------------------------------------------------------- map = new HashMap<String, Object>(); date = soapObject.getProperty(18).toString(); String weatherAfterTomorrow = "后天:" + date.split(" ")[0]; weatherAfterTomorrow += "\n天气:" + date.split(" ")[1]; weatherAfterTomorrow += "\n气温:" + soapObject.getProperty(17).toString(); weatherAfterTomorrow += "\n风力:" + soapObject.getProperty(19).toString(); weatherAfterTomorrow += "\n"; icons = new ArrayList<Integer>(); icons.add(parseIcon(soapObject.getProperty(20).toString())); icons.add(parseIcon(soapObject.getProperty(21).toString())); map.put("weatherDay", weatherAfterTomorrow); map.put("icons", icons); list.add(map); // 把解析后的数据放到一个list中 bean.setList(list); return bean; } // 解析图标字符串 private int parseIcon(String data) { // 0.gif,返回名称0, int resID = 32; String result = data.substring(0, data.length() - 4).trim(); // String []icon=data.split("."); // String result=icon[0].trim(); // Log.e("this is the icon", result.trim()); if (!result.equals("nothing")) { resID = Integer.parseInt(result.trim()); } return resID; // return ("a_"+data).split(".")[0]; } }</span>
import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.MarshalBase64; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.AndroidHttpTransport; import org.xmlpull.v1.XmlPullParserException; /** * 这个是使用另一种方式获取信息,主要是书写代码的方式不同 * @author Song Shi Chao * */ public class WebServiceUtil { // 命名空间 private static final String serviceNameSpace = "http://WebXml.com.cn/"; // 请求URL private static final String serviceURL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx"; // 调用方法(获得支持的城市) private static final String getSupportCity = "getSupportCity"; // 调用城市的方法(需要带参数) private static final String getWeatherbyCityName = "getWeatherbyCityName"; // 调用省或者直辖市的方法(获得支持的省份或直辖市) private static final String getSupportProvince = "getSupportProvince"; /** * @return城市列表 */ public static List<String> getCityList() { // 实例化SoapObject对象 SoapObject request = new SoapObject(serviceNameSpace, getSupportCity); // 获得序列化的Envelope SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = request; (new MarshalBase64()).register(envelope); // Android传输对象 AndroidHttpTransport transport = new AndroidHttpTransport(serviceURL); transport.debug = true; // 调用 try { transport.call(serviceNameSpace + getWeatherbyCityName, envelope); if (envelope.getResponse() != null) { return parse(envelope.bodyIn.toString()); } } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } return null; } public static List<String> getProviceList() { // 实例化SoapObject对象 SoapObject request = new SoapObject(serviceNameSpace, getSupportProvince); // 获得序列化的Envelope SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = request; (new MarshalBase64()).register(envelope); // Android传输对象 AndroidHttpTransport transport = new AndroidHttpTransport(serviceURL); transport.debug = true; // 调用 try { transport.call(serviceNameSpace + getWeatherbyCityName, envelope); if (envelope.getResponse() != null) { return null; } } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } return null; } /** * @param cityName * @return */ public static String getWeather(String cityName) { return ""; } /** * 解析XML */ private static List<String> parse(String str) { String temp; List<String> list = new ArrayList<String>(); if (str != null && str.length() > 0) { int start = str.indexOf("string"); int end = str.lastIndexOf(";"); temp = str.substring(start, end - 3); String[] test = temp.split(";"); for (int i = 0; i < test.length; i++) { if (i == 0) { temp = test[i].substring(7); } else { temp = test[i].substring(8); } int index = temp.indexOf(","); list.add(temp.substring(0, index)); } } return list; } /** * 获取天气 * @param soapObject **/ private void parseWeather(SoapObject soapObject) { // String date=soapObject.getProperty(6); } }
/** * 封装天气情况的JAVA BEAN * * @author Song Shi Chao * */ public class WeatherBean { // 城市名 public String cityName; // 城市简介 public String cityDescription; // 天气实况+建议 public String liveWeather; public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public String getCityDescription() { return cityDescription; } public void setCityDescription(String cityDescription) { this.cityDescription = cityDescription; } public String getLiveWeather() { return liveWeather; } public void setLiveWeather(String liveWeather) { this.liveWeather = liveWeather; } public void setList(List<Map<String, Object>> list) { Map<String, Object> map = new HashMap<String, Object>(); for(int i=0; i<list.size(); i++){ map = list.get(i); WeatherBean w = new WeatherBean(); Object o = map.get("weatherDay"); System.out.println(o.toString()); } } }
对应界面类
import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.AndroidHttpTransport; import android.app.TabActivity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.SimpleAdapter; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; import android.widget.TextView; public class WeatherInfoActivity extends TabActivity implements OnTabChangeListener { public static final String TAG = "WeatherInfoActivity"; WebServiceHelper wsh; WeatherBean bean = new WeatherBean(); TabHost mTabHost; String city; TextView txt1, txt2, txt3; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weatherinfo); Intent i = this.getIntent(); if (i != null) { Bundle bd = i.getExtras(); if (bd != null) { if (bd.containsKey("city")) { city = bd.getString("city"); } } } mTabHost = getTabHost(); // 设置容器的背景色 mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150)); mTabHost.addTab(mTabHost .newTabSpec("one") .setIndicator("天气", getResources().getDrawable(R.drawable.icon)) .setContent(R.id.lin1)); mTabHost.addTab(mTabHost .newTabSpec("two") .setIndicator("天气情况", getResources().getDrawable(R.drawable.icon)) .setContent(R.id.textview2)); mTabHost.addTab(mTabHost .newTabSpec("three") .setIndicator("城市信息", getResources().getDrawable(R.drawable.icon)) .setContent(R.id.textview3)); mTabHost.setCurrentTab(0); mTabHost.setOnTabChangedListener(this); Button btn1 = (Button) this.findViewById(R.id.button1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new Thread() { public void run() { try { SoapObject msg = new SoapObject( "http://WebXml.com.cn/", "getWeatherbyCityName"); msg.addProperty("theCityName", city); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = msg; envelope.dotNet = true; AndroidHttpTransport sendRequest = new AndroidHttpTransport( "http://www.webxml.com.cn/webservices/weatherwebservice.asmx"); envelope.setOutputSoapObject(msg); sendRequest .call("http://WebXml.com.cn/getWeatherbyCityName", envelope); SoapObject result = (SoapObject) envelope.bodyIn; SoapObject detail = (SoapObject) result .getProperty("getWeatherbyCityNameResult"); System.out.println(detail + ""); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }); } public void init() { txt1 = (TextView) this.findViewById(R.id.textview1); txt2 = (TextView) this.findViewById(R.id.textview2); txt3 = (TextView) this.findViewById(R.id.textview3); } @Override public void onTabChanged(String tabId) { WebServiceHelper wsh = new WebServiceHelper(); // 如果是天气选项卡,就获取天气 if (tabId.equals("one")) { // SimpleAdapter adapter = new SimpleAdapter(this, weather_list_map, // R.layout.listview_item, // new String[]{"weatherDay","icons"}, // new int[]{R.id.info_weather,R.id.image_weather}); // mListView_weather.setAdapter(adapter); } // 如果是天气情况选项卡,就获取天气情况 if (tabId.equals("two")) { wsh.getWeatherByCityTest(city); } // 如果是城市信息选项卡,就获取城市信息 if (tabId.equals("three")) { bean = wsh.getWeatherByCity(city); String liveWeather = bean.getLiveWeather(); // 天气 String cityDes = bean.getCityDescription(); String cityInfo = bean.getCityName(); // 城市信息 Log.i(TAG, "liveWeather = " + liveWeather); Log.i(TAG, "cityDes = " + cityDes); Log.i(TAG, "cityInfo = " + cityInfo); } } }
对应xml布局:
<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/lin1" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button" ></Button> <TextView android:id="@+id/textview1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="this is one tab" /> </LinearLayout> <TextView android:id="@+id/textview2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="this is two tab" /> <TextView android:id="@+id/textview3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="this is third tab" /> </FrameLayout> </LinearLayout> </TabHost>
import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class ProvinceActivity extends Activity { public static final String TAG = "ProvinceActivity"; WebServiceHelper wsh = new WebServiceHelper(); public ProvinceAdapter provinceAdapter; public List<String> provinces = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.province); ListView province = (ListView) this.findViewById(R.id.proviceList); provinces = wsh.getProvince(); provinceAdapter = new ProvinceAdapter(); Log.i(TAG, ""+provinces); province.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Object obj = view.getTag(); Log.i(TAG, ""+view.getTag()); if (obj != null) { String id1 = obj.toString(); Log.i(TAG, ""+ obj.toString()); Intent intent = new Intent(ProvinceActivity.this, CityActivity.class); Bundle b = new Bundle(); b.putString("province", id1); intent.putExtras(b); startActivity(intent); } } }); province.setAdapter(provinceAdapter); } class ProvinceAdapter extends BaseAdapter { @Override public int getCount() { return provinces.size(); } @Override public Object getItem(int position) { return provinces.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //下面俩种方法都可以 // LayoutInflaterinflater=getLayoutInflater(); //LayoutInflaterinflater=(LayoutInflater)mContext.getSystemServic(LAYOUT_INFLATER_SERVICE); LayoutInflater mInflater = getLayoutInflater(); convertView = mInflater.inflate(R.layout.province_item, null); TextView tv = (TextView) convertView.findViewById(R.id.proviceText); tv.setText(provinces.get(position)); convertView.setTag(tv.getText()); return convertView; } } }
对应xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/proviceList" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
import java.util.ArrayList; import java.util.List; import com.parabola.main.ProvinceActivity.ProvinceAdapter; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; public class CityActivity extends Activity { public static final String TAG = "CityActivity"; String city = null; WebServiceHelper wsh = new WebServiceHelper(); List<String> citys = new ArrayList<String>(); CityAdapter cityAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.city); ListView cityList = (ListView) this.findViewById(R.id.cityList); Intent i = this.getIntent(); if(i != null){ Bundle bd = i.getExtras(); if(bd != null){ if(bd.containsKey("province")){ city = bd.getString("province"); } } } citys = wsh.getCitys(city); cityAdapter = new CityAdapter(); cityList.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Object obj = view.getTag(); if (obj != null) { String id1 = obj.toString(); Log.i(TAG, ""+ obj.toString()); Intent intent = new Intent(CityActivity.this, WeatherInfoActivity.class); Bundle b = new Bundle(); b.putString("city", id1); intent.putExtras(b); startActivity(intent); } } }); cityList.setAdapter(cityAdapter); } class CityAdapter extends BaseAdapter { @Override public int getCount() { return citys.size(); } @Override public Object getItem(int position) { return citys.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater mInflater = getLayoutInflater(); convertView = mInflater.inflate(R.layout.province_item, null); TextView tv = (TextView) convertView.findViewById(R.id.proviceText); tv.setText(citys.get(position)); convertView.setTag(tv.getText()); return convertView; } } }
对应XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/proviceText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="City"> </TextView> <ListView android:id="@+id/cityList" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
5、直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。