java 获取城市列表_获取中央气象台API 完整城市列表简单方式

/*** 最近在看天气预报的相关知识,想寻找一个比较合适的API接口,终于找到了这篇文档

*http://blog.csdn.net/lzqwebsoft/article/details/7054045* 里面详细说明的怎样从中国天气网获取天气信息,可是没用几天发现文中使用的获取城市

* 列表的接口貌似被封了,导致原先的方法不使用,后悔但是没能及时将相关信息保存下来

* ,以前是考虑每次实时的从网络上获取城市列表,以防信息有变,但是这种接口本身就是

* 个不稳定的因素,所以还是得把相关信息下载下来。最后只得自己去分析网页,需找另外

* 的接口,最后终于找到了,那就老老实实把这些数据保存到数据库里面吧。

* 天气网把城市分为了3级

* 1级列表获取地址:http://www.weather.com.cn/data/city3jdata/china.html。通过访问这个地址,天气

* 网会返回一级省(自治区)的名称、ID信息;

* 2级城市城市列表获取地址:http://www.weather.com.cn/data/city3jdata/provshi/10120.html。其中“10120”

* 为一级城市的ID,返回结果是归属于该城市的2级省市的名称、ID;

* 3级城市列表获取地址:http://www.weather.com.cn/data/city3jdata/station/1012002.html。其中“1012002”

* 为2级省市ID,返回结果就是3级城市的名称和ID了。

* 获取到3级城市的名称和ID之后,就可以根据上面那篇博客里的内容获取当地的天气信息了!

**/

packagecom.ns.getweathercity;importjava.io.IOException;importorg.apache.http.HttpResponse;importorg.apache.http.HttpStatus;importorg.apache.http.HttpVersion;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.client.HttpClient;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.params.HttpClientParams;importorg.apache.http.conn.ClientConnectionManager;importorg.apache.http.conn.params.ConnManagerParams;importorg.apache.http.conn.scheme.PlainSocketFactory;importorg.apache.http.conn.scheme.Scheme;importorg.apache.http.conn.scheme.SchemeRegistry;importorg.apache.http.conn.ssl.SSLSocketFactory;importorg.apache.http.impl.client.DefaultHttpClient;importorg.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;importorg.apache.http.params.BasicHttpParams;importorg.apache.http.params.HttpConnectionParams;importorg.apache.http.params.HttpParams;importorg.apache.http.params.HttpProtocolParams;importorg.apache.http.protocol.HTTP;importorg.apache.http.util.EntityUtils;importandroid.os.AsyncTask;importandroid.os.Bundle;importandroid.app.Activity;importandroid.content.ContentValues;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;importandroid.widget.Toast;public class MainActivity extends Activity implementsOnClickListener{private Button mGetDataButton = null;private TextView mProgressTextView = null;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mGetDataButton=(Button)findViewById(R.id.get_data_btn);

mGetDataButton.setOnClickListener(this);

mProgressTextView=(TextView)findViewById(R.id.textView1);

}

@Overridepublic booleanonCreateOptionsMenu(Menu menu) {//Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);return true;

}

@Overridepublic voidonClick(View v) {switch(v.getId()) {caseR.id.get_data_btn:newGetDataTask().execute();break;default:break;

}

}private class GetDataTask extends AsyncTask{private HttpClient httpClient = null;

@Overrideprotected voidonPreExecute() {super.onPreExecute();

}

@OverrideprotectedInteger doInBackground(Void... params) {

getHttpClient();

CityDataHelper.getInstance(MainActivity.this).delete(null, null);//通过递归获取城市列表

try{

getCitys(1, "", "http://www.weather.com.cn/data/city3jdata/china.html");

}catch(ClientProtocolException e) {

Log.e("ns", "error", e);return -1;

}catch(IOException e) {

Log.e("ns", "error", e);return -1;

}return 1;

}/**这个函数的代码,参照http://blog.csdn.net/suiyuansanren/article/details/8663824这篇博文

* 写的不错*/

private synchronizedHttpClient getHttpClient() {if(httpClient == null) {final HttpParams httpParams = newBasicHttpParams();//timeout: get connections from connection pool

ConnManagerParams.setTimeout(httpParams, 5000);//timeout: connect to the server

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);//timeout: transfer data from server

HttpConnectionParams.setSoTimeout(httpParams, 5000);//set max connections per host//ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(10));//set max total connections

ConnManagerParams.setMaxTotalConnections(httpParams, 20);//use expect-continue handshake

HttpProtocolParams.setUseExpectContinue(httpParams, true);//disable stale check

HttpConnectionParams.setStaleCheckingEnabled(httpParams, false);

HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);

HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8);

HttpClientParams.setRedirecting(httpParams,false);//set user agent

String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";

HttpProtocolParams.setUserAgent(httpParams, userAgent);//disable Nagle algorithm

HttpConnectionParams.setTcpNoDelay(httpParams, true);

HttpConnectionParams.setSocketBufferSize(httpParams,8*1024);//scheme: http and https

SchemeRegistry schemeRegistry = newSchemeRegistry();

schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

ClientConnectionManager manager= newThreadSafeClientConnManager(httpParams, schemeRegistry);

httpClient= newDefaultHttpClient(manager, httpParams);

}returnhttpClient;

}private void getCitys(int level, String pid, String url) throwsClientProtocolException, IOException {

Log.i("ns", "The url is " +url);

HttpGet httpGet= null;

HttpResponse httpResponse= null;

String citys= null;

String[] citys1Array= null;int index = 0;

String cityName= null;

String cityID= null;

httpGet= newHttpGet(url);if (httpClient != null) {

httpResponse=httpClient.execute(httpGet);if (httpResponse.getStatusLine().getStatusCode() ==HttpStatus.SC_OK) {

citys=EntityUtils.toString(httpResponse.getEntity(),

HTTP.UTF_8);if (citys != null && citys.trim().length() > 0) {

citys1Array= citys.substring(1, citys.length() - 1)

.split(",");for (int i = 0; i < citys1Array.length; i++) {

index= citys1Array[i].indexOf(":");//当前城市的ID需要用上一级城市的ID拼接出来,但是有个别的三级城市直接是最终的ID了//不知道天气网为什么要这么做

cityID = citys1Array[i].substring(1, index - 1);if (level != 3 || cityID.length() < 9) {

cityID= pid +cityID;

}//这里把当前正在进行的操作提示处理,以确保正在工作

publishProgress(Integer.parseInt(cityID));

cityName= citys1Array[i].substring(index + 2,

citys1Array[i].length()- 1);//插入数据库

ContentValues values = newContentValues();

values.put(CityContract.City.NAME, cityName);

values.put(CityContract.City.CITY_ID, cityID);

values.put(CityContract.City.LEVEL, level);

values.put(CityContract.City.PARENT_CITY_ID, pid);

CityDataHelper.getInstance(MainActivity.this)

.insert(values);//递归下一级列表

if (level == 1) {//获取二级列表

getCitys(2, cityID,"http://www.weather.com.cn/data/city3jdata/provshi/"

+ cityID + ".html");

}else if (level == 2) {//获取三级列表

getCitys(3, cityID,"http://www.weather.com.cn/data/city3jdata/station/"

+ cityID + ".html");

}else if (level == 3) {continue;

}

}

}

}

}

}

@Overrideprotected voidonProgressUpdate(Integer... values) {super.onProgressUpdate(values);

mProgressTextView.setText(values[0].intValue() + "");

}

@Overrideprotected voidonPostExecute(Integer result) {super.onPostExecute(result);

Toast.makeText(MainActivity.this, "数据拉取完毕", Toast.LENGTH_SHORT).show();//到这里,所有城市的名称、ID以及他们之间的关系就存放到数据库里面了,下次直接使用即可

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值