本文參與:Testin—安卓巴士Android開發原創教程大賽
本項目是使用愛幫公交提供的SDK作為我們開發的基礎,通過輸入公交路線,發送到遠程服務器,接着遠程服務器返回一個json格式的結果數據,我再將這個json格式的結果數據解析到listview控件里。
(1)首先先去申請API KEY, 愛幫的API的網址:http://www.aibang.com/api/
<ignore_js_op>
(2)了解下愛幫API,愛幫返回的數據有兩種格式,一種是xml,另一種是json,這次只是講json的解析,這次實現的功能模塊是“公交線路查詢”
來了解一個url:http://openapi.aibang.com/bus/lines?app_key=f41c8afccc586de03a99c86097e98ccb&city=%E5%B9%BF%E5%B7%9E&q=b25
將這條url放在瀏覽器里訪問,將會返回如下的數據:
<ignore_js_op>
顯然上面的是xml格式的數據,只要在url后面加上"&alt=json",即可返回json格式的數據。
這條url的參數說明如下:
<ignore_js_op>
返回的數據的說明:
<ignore_js_op>
詳細請查看 :http://www.aibang.com/api/usage#bus_lines
(3)下載愛幫公交SDK,解壓后有兩個文件夾,一個是sdk,一個是demo,公交線路查詢模塊就參考了一下demo,sdk文件夾下的apidoc里面的api說明文檔是我們要經常看的。sdk文件夾下的lib文件夾下有個aibang-android-open-sdk-1.0.0.jar 包,我們等會新建項目時要把這個jar包導進去的,另外還要去下載httpmime-4.2.1.jar這個jar包。
(4)新建一個項目,我將其命名為MyAiBang1.0,如下圖所示:
<ignore_js_op>
file:///C:/Users/Administrator/AppData/Local/youdao/ynote/images/0460029C43F549E799224E54F04E1E8E/3.jpg
(5)建議大家先導入項目運行起來,玩下就明白了,現在也先演示下:
運行軟件起來,並輸入要查詢的路線如下:
<ignore_js_op>
點擊查詢,便查出與25號線相關的公交路線(數據解析后填充在一個ListView控件里):
<ignore_js_op>
再點擊其中一條路線,如點擊b25路,便跳轉到另一個Activity,如下:
<ignore_js_op>
(6)看看返回的數據,像result_num、web_url等我是用不到的,我能用到的只有name、info、stats三個字段,所以我在com.myaibang.domain包下新建一個Line類,如下:
public class Line {
private String name;
private String info;
private String stats;
public Line(String name, String info, String stats) {
this.name = name;
this.info = info;
this.stats = stats;
}
public Line() {
}
//省略getter和setter方法
}
(7)新建一個Activity,我將其命名為RouteActivity,對應下面兩個頁面:
<ignore_js_op>
<ignore_js_op>
請對應代碼聽我講解,哈。
在RouteActivity里建一個內部類AibangAsyncTask,如下:
private class AibangAsyncTask extends AsyncTask<Void, Void, JSONObject>
這個主要參考下載的sdk里的demo,關於AsyncTask,大家可以網上找下相關資料看看,因為這節主要是講json的解析,所以略過。
private static final String API_KEY="766cb8dbbdb7fba92de17f0b2d88745b"; API_KEY,大家懂的,用剛剛申請的。
mAibang=new AibangApi(API_KEY); 初始化,默認是返回json格式的數據。
routeData=editText.getText().toString(); 這個是獲取輸入框里輸入的路線的數據。
result=mAibang.busLines("廣州", routeData, 0); 這里我是寫死城市是廣州的,result就是返回的數據,是json格式的。
JSONObject jsonObject=new JSONObject(result);
String lines=jsonObject.getString("lines");
JSONObject jsonObject2=new JSONObject(lines);
String line=jsonObject2.getString("line");
JSONArray jsonArray=new JSONArray(line); 通過LogCat可以查看到line返回的是數組,所以我將其初始化為一個json數組
List<String> data = new ArrayList<String>();
List<Line> list=new ArrayList<Line>();
for(int i=0;i<jsonArray.length();i++){
jsonObject2=jsonArray.getJSONObject(i);
String name=jsonObject2.getString("name");
String info=jsonObject2.getString("info");
String stats=jsonObject2.getString("stats");
list.add(new Line(name,info,stats));
data.add(name);
} 通過遍歷,解析json格式的數據,data的數據添加到當前的ListView里面。
listView.setAdapter(new ArrayAdapter<String>(RouteActivity.this, android.R.layout.simple_expandable_list_item_1,data)); 這句不用解釋了吧,呵!就是將數據添加到ListView顯示出來。
//intent將數據傳到RouteResultActivity
Intent intent=new Intent(RouteActivity.this,RouteResultActivity.class);
intent.putExtra("resultData", list.get(arg2).getStats()); 我要的是各個站點的數據。
startActivity(intent);
overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);一個過渡的動畫,不錯的例子來的,可以參考用到其他項目中去。
(8)新建名為RouteResultActivity的類,顯示線路的各個站點
Intent intent=getIntent();
String value=intent.getStringExtra("resultData"); 獲取RouteActivity傳過來的值。
點擊B25,通過LogCat查看返回的值如下:
體育中心;石牌橋(BRT);崗頂(BRT);師大暨大(BRT);華景新城(BRT);上社(BRT);學院(BRT);科韻路;琶洲大橋北;北山;星海學院[大學城];華師[大學城];廣大[大學城];廣大生活區[大學城];廣大公寓[大學城];大學城總站[中部樞紐]
List<String> data = new ArrayList<String>(); 將解析的以上的數據一個個添加到data里。
解析的思想:主要是通過“;”,如下:
int j=0;
for(int i=0;i<value.length();i++){
if(value.charAt(i)==';'){
infoData=value.substring(j,i);
Log.v(TAG, "返回的infoData值為"+infoData);
j=i+1;
data.add(infoData);
}
if(i==value.length()-1){
infoData=value.substring(j,i+1);
Log.v(TAG, "返回的infoData值為"+infoData);
data.add(infoData);
}
}
listView2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,data)); 顯示出來了。
(9)json格式的數據解析其實很簡單,關鍵要看好那個格式是如何組成的,有沒有數組。有一個網站,格式化json格式挺不錯的,介紹一下:http://jsonformatter.curiousconcept.com/
(10)除了解析json數據這塊之外,本項目的首頁淡入淡出的效果、兩個Activity之間的跳轉動畫、底部tabhost導航菜單,這些在實戰應用中也是常用到的,需要的話可以參考一下,對本文有疑問的可以找我。我的郵箱是262821820@qq.com,大家一起共同探討吧!哈。
源碼下載: <ignore_js_op>
MyAiBang1.0.zip
