使用weather.com.cn数据实现的简易天气demo
2014-06-11 14:32
288 查看
通过网上搜索,找到了中国中央气象局的天气接口网址:http://m.weather.com.cn/data/101010100.html,其中数字部分为城市代码。从网上找到一个sqlite的数据库,存储了省市区的信息和城市代码,一共2556条数据,程序先将数据库copy到程序目录的file下,再读取。连网部分是使用AsyncHttpClient写的。
基本想法是做两个界面,一个界面用于显示从接口返回的数据,一个界面用于选择城市。为了简便,直接将json数据放在textview中显示,不再解析。
main.xml
MainActivity.java
select_area.xml
SelectAreaActivity.java
程序非常简陋,仅为练手。项目下载地址:http://download.csdn.net/detail/lgl1170860350/7482453
程序运行部分截图:
基本想法是做两个界面,一个界面用于显示从接口返回的数据,一个界面用于选择城市。为了简便,直接将json数据放在textview中显示,不再解析。
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="jsj.lgl.weather.MainActivity" > <Button android:id="@+id/btn_setting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="select area" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/btn_setting" > <TextView android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/btn_setting" /> </ScrollView> </RelativeLayout>
MainActivity.java
package jsj.lgl.weather; import java.io.UnsupportedEncodingException; import org.apache.http.Header; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.FastjsonHttpResponseHandler; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { TextView content; Button btn_setting; AsyncHttpClient httpClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); httpClient = new AsyncHttpClient(); content = (TextView) findViewById(R.id.content); btn_setting = (Button) findViewById(R.id.btn_setting); btn_setting.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SelectAreaActivity.class); startActivityForResult(intent, 100); } }); //getWeatherData("101010100"); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == Activity.RESULT_OK) { if(requestCode == 100) { String code = data.getExtras().getString("code"); getWeatherData(code); } } super.onActivityResult(requestCode, resultCode, data); } private void getWeatherData(String areaId) { String url = "http://m.weather.com.cn/data/"+ areaId +".html"; content.setText("loading data"); httpClient.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { super.onSuccess(statusCode, headers, responseBody); String response = null; try { response = responseBody == null ? null : new String(responseBody, getCharset()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } content.setText(response); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { super.onFailure(statusCode, headers, responseBody, error); String error_text = "error!\nstatusCode=" + statusCode; if(error != null) { error_text += "\nerror_message:" + error.getMessage(); } content.setText(error_text); } }); } }
select_area.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal"> <TextView android:id="@+id/tv_province" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:text="select province" android:background="#f00" /> <TextView android:id="@+id/tv_city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:layout_marginTop="20dp" android:text="select city" android:background="#f00" /> <TextView android:id="@+id/tv_area" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:layout_marginTop="20dp" android:text="select area" android:background="#f00" /> <Button android:id="@+id/btn_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="ok" /> </LinearLayout>
SelectAreaActivity.java
package jsj.lgl.weather; import java.util.List; import jsj.lgl.weather.model.Area; import jsj.lgl.weather.model.City; import jsj.lgl.weather.model.Province; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class SelectAreaActivity extends Activity { TextView tv_province, tv_city, tv_area; List<Province> listProvince; List<City> listCity; List<Area> listArea; Dialog dialogProvince, dialogCity, dialogArea; Button btn_ok; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.select_area); tv_province = (TextView) findViewById(R.id.tv_province); tv_city = (TextView) findViewById(R.id.tv_city); tv_area = (TextView) findViewById(R.id.tv_area); btn_ok = (Button) findViewById(R.id.btn_ok); tv_province.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showProvinceDialog(); } }); tv_city.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showCityDialog(); } }); tv_area.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showAreaDialog(); } }); btn_ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String code = (String) tv_area.getTag(); Log.i("code", "code=" + code); setResult(Activity.RESULT_OK, new Intent().putExtra("code", code)); SelectAreaActivity.this.finish(); } }); listProvince = DBUtil.getProvinceWithoutChild(this); } private void showProvinceDialog() { if(dialogProvince == null) { String[] provinces = new String[listProvince.size()]; for(int i=0,len=listProvince.size();i<len;i++) { provinces[i] = listProvince.get(i).name; } dialogProvince = new AlertDialog.Builder(this) .setTitle("选择省") .setIcon(android.R.drawable.ic_dialog_info) .setSingleChoiceItems(provinces, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String id = listProvince.get(which).id; String name = listProvince.get(which).name; tv_province.setText(name); tv_province.setTag(id); dialogProvince.dismiss(); listCity = DBUtil.getCityByProvinceId(SelectAreaActivity.this, id); } }) .create(); } dialogProvince.show(); } private void showCityDialog() { if(listCity == null) { return; } String[] citys = new String[listCity.size()]; for(int i=0,len=listCity.size();i<len;i++) { citys[i] = listCity.get(i).name; } dialogCity = new AlertDialog.Builder(this) .setTitle("选择城市") .setIcon(android.R.drawable.ic_dialog_info) .setSingleChoiceItems(citys, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String id = listCity.get(which).id; String name = listCity.get(which).name; tv_city.setText(name); tv_city.setTag(id); dialogCity.dismiss(); listArea = DBUtil.getAreaByCityId(SelectAreaActivity.this, id); } }) .create(); dialogCity.show(); } private void showAreaDialog() { if(listArea == null) { return; } String[] areas = new String[listArea.size()]; for(int i=0,len=listArea.size();i<len;i++) { areas[i] = listArea.get(i).name; } dialogArea = new AlertDialog.Builder(this) .setTitle("选择地区") .setIcon(android.R.drawable.ic_dialog_info) .setSingleChoiceItems(areas, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String code = listArea.get(which).code; String name = listArea.get(which).name; tv_area.setText(name); tv_area.setTag(code); dialogArea.dismiss(); //listCity = DBUtil.getCityByProvinceId(SelectAreaActivity.this, id); } }) .create(); dialogArea.show(); } }
程序非常简陋,仅为练手。项目下载地址:http://download.csdn.net/detail/lgl1170860350/7482453
程序运行部分截图:
相关文章推荐
- 使用Sqlserver事务发布实现数据同步(引:http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html )
- 用"http://m.weather.com.cn/data/" + cityCode + ".html"获取城市天气
- Kafka 使用Java实现数据的生产和消费demo
- Android使用局和数据实现天气项目-android学习之旅(十二)
- Demo22 :线程同步(使用同步锁实现对共享数据的操作)
- 关于中国天气(Weather.com.cn)的查询
- php 抓取天气情况 www.weather.com.cn
- Kafka 使用Java实现数据的生产和消费demo
- Qt实现简易天气预报(解析的是json数据)
- ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息
- Android使用局和数据实现天气项目-android学习之旅(十二)
- 天气接口 http://flash.weather.com.cn/wmaps/xml/china.xml
- Android 端天气预报APP的实现(四)使用ViewPager展示天气数据
- 使用JAVA中的动态代理实现数据库连接池(载自:http://www.ibm.com/developerworks/cn/java/l-connpoolproxy/)
- ios项目开发(天气预报项目):使用正则获取 weather.com.cn站点信息
- [Android | 小代码] 天气预报 简易Demo json解析数组+对象 Gson+Volley简单使用
- ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息
- [转]使用Excel分析MySQL数据[http://database.ctocio.com.cn/tips/145/7138145_3.shtml]
- python获取网站http://www.weather.com.cn 城市 8-15天天气
- php 抓取天气情况 www.weather.com.cn