编程环境:Eclipse3.5.2 + Android 2.3.3 + Linux 3.0.0 (Ubuntu 11.10)
架构图:
主界面显示一个当前时间的天气信息和后四天的天气信息。天气信息来源Google的天气API。 publicstaticfinalStringqueryString= "http://www.google.com/ig/api?hl=zh-cn&weather="; |
考虑到网络的延迟和用户的体验,从服务器上读取信息的代码在线程中进行和用Handler处理消息:
publicvoidrun() { mHandler.sendEmptyMessage(RUNNABLESTART); String cityParamString = ConstData.cityCode[this.city_index]; try{ URL url =newURL(ConstData.queryString+ cityParamString); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); GoogleWeatherHandler gwh =newGoogleWeatherHandler(); xr.setContentHandler(gwh); InputStreamReader isr =newInputStreamReader(url.openStream(), "GBK"); InputSource is =newInputSource(isr); xr.parse(is); my_ws = gwh.getMyWeatherSet(); mHandler.sendEmptyMessage(SHOWINFORMATION); }catch(UnknownHostException e){ mHandler.sendEmptyMessage(LOSTHOST); }catch(Exception e) { e.printStackTrace(); } } Handler mHandler =newHandler() { @Override publicvoidhandleMessage(Message msg) { super.handleMessage(msg); switch(msg.what) { caseLOSTHOST: pd.dismiss(); Toast.makeText(MainActivity.this, "无法连接服务器,请检查您的网络", Toast.LENGTH_LONG).show(); break; caseSHOWINFORMATION: try{ if(my_ws.getMyCurrentCondition()!=null){ updateCurrWeather(my_ws.getMyCurrentCondition()); updateInformation(my_ws.getInformation()); updateWeatherInfoView(R.id.weather_1, my_ws.getMyForecastConditions().get(0)); updateWeatherInfoView(R.id.weather_2, my_ws.getMyForecastConditions().get(1)); updateWeatherInfoView(R.id.weather_3, my_ws.getMyForecastConditions().get(2)); updateWeatherInfoView(R.id.weather_4, my_ws.getMyForecastConditions()get(3)); }else{ Toast.makeText(MainActivity.this, "没有该城市信息!", Toast.LENGTH_LONG).show(); } }catch(Exception e) { e.printStackTrace(); } pd.dismiss(); mThread.stop();//非线程安全,但在这次APP中,不会有什么问题。 break; caseRUNNABLESTART: pd = ProgressDialog.show(MainActivity.this, "请稍等", "正在加载信息...",true); break; } } |
主界面有两个按钮,对应两个功能,非别是 选择城市 和 我的城市。
1)选择城市
弹出一个框,可以自己搜索想要的城市。为方便输入,输入框使用了AutoCompleteTextView。(虚拟机不支持中文,所以这里使用了城市名的全拼)
@Override protectedDialog onCreateDialog(intid) { LayoutInflater dialoglayout = LayoutInflater.from(this); finalView textEntryView = dialoglayout.inflate(R.layout.dialog,null); ArrayAdapter<String> adapter =newArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, ConstData.cityCode); /*findByView方法时 要注意布局关系*/ finalAutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) textEntryView.findViewById(R.id.search); autoCompleteTextView.setAdapter(adapter); returnnewAlertDialog.Builder(this) .setView(textEntryView) .setIcon(R.drawable.search) .setTitle("请输入城市") .setPositiveButton(R.string.set_to_mycity,newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterface dialog,intwhichButton) { city_index = convertCity_nameToCity_code(autoCompleteTextView.getText().toString()); SharedPreferences.Editor editor = sharedPreferences.edit(); String key = "MyCitys"+city_index; if(!sharedPreferences.contains(key)){ try{ editor.putString(key, ConstData.city[city_index]); editor.commit(); }catch(ArrayIndexOutOfBoundsException e){ Toast.makeText(MainActivity.this, "城市名有誤!",Toast.LENGTH_LONG).show(); } } mThread.run(); } }) .setNegativeButton(R.string.start_search,newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterface dialog,intwhichButton) { city_index = convertCity_nameToCity_code(autoCompleteTextView.getText().toString()); Log.i("tag","autoCompleteTextView.getListSelection() = "+city_index); if( city_index >= 0 ) mThread.run() ; elseToast.makeText(MainActivity.this, "获取城市信息失败", Toast.LENGTH_LONG); } }) .create(); } |
2)我的城市
可以将自己所在的城市或者关注的城市添加到此,方便日后的查询。这里用了ListView控件显示数据,数据存储在SharedPreferences中。
list =newArrayList<String>(); lv =newListView(this); sharedPreferences = getSharedPreferences(PREFERENCE_NAME,MODE); editor = sharedPreferences.edit(); init(); lv.setOnItemClickListener(newOnItemClickListener(){ //单击监听事件 publicvoidonItemClick(AdapterView<?> arg0, View arg1,intpos, longarg3) { Intent intent =newIntent(ListOfMyCity.this, MainActivity.class); String name = list.get(pos); inti ; for(i=0; i < ConstData.city.length; i++){ if(name.equals(ConstData.city[i])){ editor.putInt("DefaultCity", i); editor.commit(); break; } } intent.putExtra("city_code", i); setResult(8, intent); finish(); }}); lv.setOnItemLongClickListener(newOnItemLongClickListener(){//长按事件 触发“删除”和“设为默认城市” 事件 publicbooleanonItemLongClick(AdapterView<?> arg0, View arg1, intpos,longarg3) { showDialog(pos); returnfalse; }}); |
删除可以将城市从 数据中删除,设为默认城市后,每次启动APP都会自动检索到该城市。
主界面:
代码:http://download.csdn.net/detail/cliffbaby/4003285