今天總結一下android客戶端從伺服器端獲取json數據的實現代碼,需要的朋友可以參考下 首先客戶端從伺服器端獲取json數據 1、利用HttpUrlConnection /** * 從指定的URL中獲取數組 * @param urlPath * @return * @throws Excepti ...
今天總結一下android客戶端從伺服器端獲取json數據的實現代碼,需要的朋友可以參考下
首先客戶端從伺服器端獲取json數據
1、利用HttpUrlConnection
/** * 從指定的URL中獲取數組 * @param urlPath * @return * @throws Exception */ public static String readParse(String urlPath) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream inStream = conn.getInputStream(); while ((len = inStream.read(data)) != -1) { outStream.write(data, 0, len); } inStream.close(); return new String(outStream.toByteArray());//通過out.Stream.toByteArray獲取到寫的數據 }
2、利用HttpClient
/** * 訪問資料庫並返回JSON數據字元串 * * @param params 向伺服器端傳的參數 * @param url * @return * @throws Exception */ public static String doPost(List<NameValuePair> params, String url) throws Exception { String result = null; // 獲取HttpClient對象 HttpClient httpClient = new DefaultHttpClient(); // 新建HttpPost對象 HttpPost httpPost = new HttpPost(url); if (params != null) { // 設置字元集 HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8); // 設置參數實體 httpPost.setEntity(entity); } /*// 連接超時 httpClient.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 3000); // 請求超時 httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 3000);*/ // 獲取HttpResponse實例 HttpResponse httpResp = httpClient.execute(httpPost); // 判斷是夠請求成功 if (httpResp.getStatusLine().getStatusCode() == 200) { // 獲取返回的數據 result = EntityUtils.toString(httpResp.getEntity(), "UTF-8"); } else { Log.i("HttpPost", "HttpPost方式請求失敗"); } return result; }
其次Json數據解析:
json數據:[{"id":"67","biaoTi":"G","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741845270.png","logoLunbo":"http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg","yuanJia":"0","xianJia":"0"},{"id":"64","biaoTi":"444","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741704400.png","logoLunbo":"http://172.16.1.75:8080/wtserver/resources/upload/13508741738500.png","yuanJia":"0","xianJia":"0"},{"id":"62","biaoTi":"jhadasd","logo":"http://www.nuoter.com/wtserver/resources/upload/13508741500450.png","logoLunbo":"http://172.16.1.75:8080/wtserver/resources/upload/13508741557450.png","yuanJia":"1","xianJia":"0"}]
/** * 解析 * * @throws JSONException */ private static ArrayList<HashMap<String, Object>> Analysis(String jsonStr) throws JSONException { /******************* 解析 ***********************/ JSONArray jsonArray = null; // 初始化list數組對象 ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); jsonArray = new JSONArray(jsonStr); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); // 初始化map數組對象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("logo", jsonObject.getString("logo")); map.put("logoLunbo", jsonObject.getString("logoLunbo")); map.put("biaoTi", jsonObject.getString("biaoTi")); map.put("yuanJia", jsonObject.getString("yuanJia")); map.put("xianJia", jsonObject.getString("xianJia")); map.put("id", jsonObject.getInt("id")); list.add(map); } return list; }
最後數據適配:
1、TextView
/** * readParse(String)從伺服器端獲取數據 * Analysis(String)解析json數據 */ private void resultJson() { try { allData = Analysis(readParse(url)); Iterator<HashMap<String, Object>> it = allData.iterator(); while (it.hasNext()) { Map<String, Object> ma = it.next(); if ((Integer) ma.get("id") == id) { biaoTi.setText((String) ma.get("biaoTi")); yuanJia.setText((String) ma.get("yuanJia")); xianJia.setText((String) ma.get("xianJia")); } } } catch (JSONException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
2、ListView:
/** * ListView 數據適配 */ private void product_data(){ List<HashMap<String, Object>> lists = null; try { lists = Analysis(readParse(url));//解析出json數據 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>(); for(HashMap<String, Object> news : lists){ HashMap<String, Object> item = new HashMap<String, Object>(); item.put("chuXingTianShu", news.get("chuXingTianShu")); item.put("biaoTi", news.get("biaoTi")); item.put("yuanJia", news.get("yuanJia")); item.put("xianJia", news.get("xianJia")); item.put("id", news.get("id")); try { bitmap = ImageService.getImage(news.get("logo").toString());//圖片從伺服器上獲取 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(bitmap==null){ Log.i("bitmap", ""+bitmap); Toast.makeText(TravelLine.this, "圖片載入錯誤", Toast.LENGTH_SHORT) .show(); // 顯示圖片編號 } item.put("logo",bitmap); data.add(item); } listItemAdapter = new MySimpleAdapter1(TravelLine.this,data,R.layout.a_travelline_item, // 動態數組與ImageItem對應的子項 new String[] { "logo", "biaoTi", "xianJia", "yuanJia", "chuXingTianShu"}, // ImageItem的XML文件裡面的一個ImageView,兩個TextView ID new int[] { R.id.trl_ItemImage, R.id.trl_ItemTitle, R.id.trl_ItemContent, R.id.trl_ItemMoney, R.id.trl_Itemtoday}); listview.setAdapter(listItemAdapter); //添加點擊 listview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { login_publicchannel_trl_sub(arg2); } }); }
對於有圖片的要重寫適配器
package com.nuoter.adapterUntil; import java.util.HashMap; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Paint; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class MySimpleAdapter1 extends BaseAdapter { private LayoutInflater mInflater; private List<HashMap<String, Object>> list; private int layoutID; private String flag[]; private int ItemIDs[]; public MySimpleAdapter1(Context context, List<HashMap<String, Object>> list, int layoutID, String flag[], int ItemIDs[]) { this.mInflater = LayoutInflater.from(context); this.list = list; this.layoutID = layoutID; this.flag = flag; this.ItemIDs = ItemIDs; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return 0; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = mInflater.inflate(layoutID, null); // convertView = mInflater.inflate(layoutID, null); for (int i = 0; i < flag.length; i++) {//備註1 if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) { ImageView imgView = (ImageView) convertView.findViewById(ItemIDs[i]); imgView.setImageBitmap((Bitmap) list.get(position).get(flag[i]));///////////關鍵是這句!!!!!!!!!!!!!!! }else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) { TextView tv = (TextView) convertView.findViewById(ItemIDs[i]); tv.setText((String) list.get(position).get(flag[i])); }else{ //...備註2 } } //addListener(convertView); return convertView; } /* public void addListener(final View convertView) { ImageView imgView = (ImageView)convertView.findViewById(R.id.lxs_item_image); } */ }
對於圖片的獲取,json解析出來的是字元串url:"logoLunbo":http://www.nuoter.com/wtserver/resources/upload/13509015004480.jpg 從url獲取 圖片
ImageService工具類
package com.nuoter.adapterUntil; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImageService { /** * 獲取網路圖片的數據 * @param path 網路圖片路徑 * @return */ public static Bitmap getImage(String path) throws Exception{ /*URL url = new URL(imageUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream(); mBitmap = BitmapFactory.decodeStream(is);*/ Bitmap bitmap= null; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection();//基於HTTP協議連接對象 conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() == 200){ InputStream inStream = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(inStream); } return bitmap; } /** * 讀取流中的數據 從url獲取json數據 * @param inStream * @return * @throws Exception */ 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); } inStream.close(); return outStream.toByteArray(); } }
上面也將從url處獲取網路數據寫在了工具類ImageService中方面調用,因為都是一樣的。
當然也可以在Activity類中寫一個獲取伺服器圖片的函數(當用處不多時)
/* * 從伺服器取圖片 * 參數:String類型 * 返回:Bitmap類型 */ public static Bitmap getHttpBitmap(String urlpath) { Bitmap bitmap = null; try { //生成一個URL對象 URL url = new URL(urlpath); //打開連接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); // conn.setConnectTimeout(6*1000); // conn.setDoInput(true); conn.connect(); //得到數據流 InputStream inputstream = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(inputstream); //關閉輸入流 inputstream.close(); //關閉連接 conn.disconnect(); } catch (Exception e) { Log.i("MyTag", "error:"+e.toString()); } return bitmap; }
調用:
public ImageView pic; ..... ..... allData=Analysis(readParse(url)); Iterator<HashMap<String, Object>> it=allData.iterator(); while(it.hasNext()){ Map<String, Object> ma=it.next(); if((Integer)ma.get("id")==id) { logo=(String) ma.get("logo"); bigpic=getHttpBitmap(logo); } } pic.setImageBitmap(bigpic);
另附 下載數據很慢時建立子線程並傳參:
new Thread() { @Override public void run() { // 參數列表 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("currPage", Integer .toString(1))); nameValuePairs.add(new BasicNameValuePair("pageSize", Integer .toString(5))); try { String result = doPost(nameValuePairs, POST_URL); Message msg = handler.obtainMessage(1, 1, 1, result); handler.sendMessage(msg); // 發送消息 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); // 定義Handler對象 handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1:{ // 處理UI StringBuffer strbuf = new StringBuffer(); List<HashMap<String, Object>> lists = null; try { lists = MainActivity.this .parseJson(msg.obj.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>(); for(HashMap<String, Object> news : lists){ HashMap<String, Object> item = new HashMap<String, Object>(); item.put("id", news.get("id")); item.put("ItemText0", news.get("name")); try { bitmap = ImageService.getImage(news.get("logo").toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(bitmap==null){ Log.i("bitmap", ""+bitmap); Toast.makeText(MainActivity.this, "圖片載入錯誤", Toast.LENGTH_SHORT) .show(); // 顯示圖片編號 } item.put("ItemImage",bitmap); data.add(item); } //生成適配器的ImageItem <====> 動態數組的元素,兩者一一對應 MySimpleAdapter saImageItems = new MySimpleAdapter(MainActivity.this, data, R.layout.d_travelagence_item, new String[] {"ItemImage", "ItemText0", "ItemText1"}, new int[] {R.id.lxs_item_image, R.id.lxs_item_text0, R.id.lxs_item_text1}); //添加並且顯示 gridview.setAdapter(saImageItems); } break; default: break; } } };