android用戶端從伺服器端擷取json資料並解析的實現代碼

來源:互聯網
上載者:User

首先用戶端從伺服器端擷取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;
}

}
};

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.