Android開發之資訊客戶端

web服務器端代碼:返回兩種格式的數據json和xml

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<News> list=newsDao.newList();
		String format=request.getParameter("format");
		if("json".equals(format)){
			StringBuilder data=new StringBuilder();
			data.append("[");
			for (News news : list) {
				data.append("{");
				data.append("id:").append(news.getId()).append(",");
				data.append("name:\"").append(news.getName()).append("\",");
				data.append("date:\"").append(news.getDate()).append("\"");
				data.append("},");
			}
			data.deleteCharAt(data.length()-1);
			data.append("]");
			request.setAttribute("json", data.toString());
			request.getRequestDispatcher("/jsonnews.jsp").forward(request, response);
		}else{
			request.setAttribute("newslist", list);
			request.getRequestDispatcher("/news.jsp").forward(request, response);
		}
	}


 Android客戶端:訪問服務器並解析返回的json或xml數據

1.解析json數據

	/**
	 * 獲取json數據
	 * @return
	 * @throws Exception
	 */
	public static List<News> getJSONNews()throws Exception{
		String path="http://192.168.1.186:8080/web/NewsServlet?format=json";
		URL url=new URL(path);
		HttpURLConnection conn=(HttpURLConnection)url.openConnection();
		conn.setConnectTimeout(5000);
		conn.setRequestMethod("POST");
		if(conn.getResponseCode()==200){
			InputStream inStream=conn.getInputStream();
			return parseJSON(inStream);
		}
		return null;
	}
	private static List<News> parseJSON(InputStream inStream)throws Exception {
		List<News> list=new ArrayList<News>();
		//DataTool幫助類
		byte[] data=DataTool.read(inStream);
		String text=new String(data,"utf-8");
		JSONArray array=new JSONArray(text);
		for (int i = 0; i < array.length(); i++) {
			JSONObject object=array.getJSONObject(i);
			int id=object.getInt("id");
			String name=object.getString("name");
			String date=object.getString("date");
			list.add(new News(id, name, date));
		}
		return list;
	}

幫助類DataTool.java

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class DataTool {

	public static byte[] read(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream=new ByteArrayOutputStream();
		byte[] buffer=new byte[1024];
		int len=0;
		while((len=inStream.read(buffer))!=-1){
			outStream.write(buffer,0,len);
		}
		return outStream.toByteArray();
	}

}


2.解析xml數據

	/**
	 * 獲取xml數據
	 * @return
	 * @throws Exception
	 */
	public static List<News> getNews()throws Exception{
		String path="http://192.168.1.186:8080/web/NewsServlet";
		URL url=new URL(path);
		HttpURLConnection conn=(HttpURLConnection)url.openConnection();
		conn.setConnectTimeout(5000);
		conn.setRequestMethod("POST");
		if(conn.getResponseCode()==200){
			InputStream inStream=conn.getInputStream();
			return parseXml(inStream);
		}
		return null;
	}
	/**
	 * 解析xml
	 * @param inStream
	 * @return
	 * @throws Exception 
	 */
	private static List<News> parseXml(InputStream inStream) throws Exception {
		List<News> list=new ArrayList<News>();
		News news=null;
		XmlPullParser parser=Xml.newPullParser();
		parser.setInput(inStream, "utf-8");
		int event=parser.getEventType();
		while(event!=XmlPullParser.END_DOCUMENT){
			switch (event) {
			case XmlPullParser.START_TAG:
				if("news".equals(parser.getName())){
					int id=Integer.parseInt(parser.getAttributeValue(0));
					news=new News();
					news.setId(id);
				}
				if("title".equals(parser.getName())){
					String name=parser.nextText();
					news.setName(name);
				}
				if("date".equals(parser.getName())){
					String date=parser.nextText();
					news.setDate(date);
				}
				break;
			case XmlPullParser.END_TAG:
				if("news".equals(parser.getName())){
					list.add(news);
					news=null;
				}
				break;
			}
			event=parser.next();
		}
		return list;
	}

最後在MainActivity類中實現將數據顯示到頁面

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //android3.0以上需要調用此方法才能訪問網絡
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()                     
	        .detectDiskReads()                     
	        .detectDiskWrites()                     
	        .detectNetwork()   // or .detectAll() for all detectable problems                     
	        .penaltyLog()                     
	        .build());             
	    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()             
	        .detectLeakedSqlLiteObjects() //探測SQLite數據庫操作        
	        .detectLeakedClosableObjects() 
	        .penaltyLog() //打印logcat             
	        .penaltyDeath()             
	        .build());
	    listview=(ListView)findViewById(R.id.newslist);
        try {
        	List<Map<String, Object>> data=new ArrayList<Map<String,Object>>();
			List<News> list=NewsService.getJSONNews();
			for (News news : list) {
				Map<String, Object> map=new HashMap<String, Object>();
				map.put("u_id", news.getId().toString());
				map.put("name", news.getName());
				map.put("date", news.getDate());
				data.add(map);
			}
			SimpleAdapter adapter=new SimpleAdapter(this, data, R.layout.items, new String[]{"u_id","name","date"}, new int[]{R.id.u_id,R.id.name,R.id.date});
			listview.setAdapter(adapter);
		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(getApplicationContext(), R.string.error, Toast.LENGTH_SHORT).show();
		}
    }


頁面的佈局就不再放了,就是一個listview控件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章