天气预报的实现分析

来源:互联网 发布:js qq在线客服插件 编辑:程序博客网 时间:2024/05/21 06:41

1.运行效果图

      

2.核心代码

<span style="color:#3366FF;">WeatherActivity。java</span>  
MainActivity
public class WeatherActivity extends Activity implements OnClickListener{        private LinearLayout weatherInfoLayout;      /**      * 用于显示城市名      */      private TextView cityNameText;      /**      * 用于显示发布时间      */      private TextView publishText;      /**      * 用于显示天气描述信息      */      private TextView weatherDespText;      /**      * 用于显示气温1      */      private TextView temp1Text;      /**      * 用于显示气温2      */      private TextView temp2Text;      /**      * 用于显示当前日期      */      private TextView currentDateText;      /**      * 切换城市按钮      */      private Button switchCity;      /**      * 更新天气按钮      */      private Button refreshWeather;                  @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          requestWindowFeature(Window.FEATURE_NO_TITLE);          setContentView(R.layout.weather_layout);          // 初始化各控件          weatherInfoLayout = (LinearLayout) findViewById(R.id.weather_info_layout);          cityNameText = (TextView) findViewById(R.id.city_name);          publishText = (TextView) findViewById(R.id.publish_text);          weatherDespText = (TextView) findViewById(R.id.weather_desp);          temp1Text = (TextView) findViewById(R.id.temp1);          temp2Text = (TextView) findViewById(R.id.temp2);          currentDateText = (TextView) findViewById(R.id.current_date);          switchCity = (Button) findViewById(R.id.switch_city);          refreshWeather = (Button) findViewById(R.id.refresh_weather);          String countyCode = getIntent().getStringExtra("county_code");          if (!TextUtils.isEmpty(countyCode)) {              // 有县级代号时就去查询天气              publishText.setText("同步中...");              weatherInfoLayout.setVisibility(View.INVISIBLE);              cityNameText.setVisibility(View.INVISIBLE);              queryWeatherCode(countyCode);          } else {              // 没有县级代号时就直接显示本地天气              showWeather();          }          switchCity = (Button) findViewById(R.id.switch_city);          refreshWeather = (Button) findViewById(R.id.refresh_weather);          switchCity.setOnClickListener(this);          refreshWeather.setOnClickListener(this);      }            @Override      public void onClick(View v) {          switch (v.getId()) {          case R.id.switch_city:              Intent intent = new Intent(this, ChooseAreaActivity.class);              intent.putExtra("from_weather_activity", true);              startActivity(intent);              finish();              break;          case R.id.refresh_weather:              publishText.setText("同步中...");              SharedPreferences prefs = PreferenceManager. getDefaultSharedPreferences(this);              String weatherCode = prefs.getString("weather_code", "");              if (!TextUtils.isEmpty(weatherCode)) {                  queryWeatherInfo(weatherCode);              }              break;          default:              break;          }      }            /**      * 查询县级代号所对应的天气代号。      */      private void queryWeatherCode(String countyCode) {          String address = "http://www.weather.com.cn/data/list3/city" + countyCode + ".xml";          queryFromServer(address, "countyCode");      }        /**      * 查询天气代号所对应的天气。      */      private void queryWeatherInfo(String weatherCode) {          String address = "http://www.weather.com.cn/data/cityinfo/" + weatherCode + ".html";          queryFromServer(address, "weatherCode");      }            /**      * 根据传入的地址和类型去向服务器查询天气代号或者天气信息。      */      private void queryFromServer(final String address, final String type) {          HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {              @Override              public void onFinish(final String response) {                  if ("countyCode".equals(type)) {                      if (!TextUtils.isEmpty(response)) {                          // 从服务器返回的数据中解析出天气代号                          String[] array = response.split("\\|");                          if (array != null && array.length == 2) {                              String weatherCode = array[1];                              queryWeatherInfo(weatherCode);                          }                      }                  } else if ("weatherCode".equals(type)) {                      // 处理服务器返回的天气信息                      Utility.handleWeatherResponse(WeatherActivity.this, response);                      runOnUiThread(new Runnable() {                          @Override                          public void run() {                              showWeather();                          }                      });                  }              }                            @Override              public void onError(Exception e) {                  runOnUiThread(new Runnable() {                      @Override                      public void run() {                          publishText.setText("同步失败");                      }                  });              }          });   }            /**      * 从SharedPreferences文件中读取存储的天气信息,并显示到界面上。      */      private void showWeather() {          SharedPreferences prefs = PreferenceManager. getDefaultSharedPreferences(this);          cityNameText.setText( prefs.getString("city_name", ""));          temp1Text.setText(prefs.getString("temp1", ""));          temp2Text.setText(prefs.getString("temp2", ""));          weatherDespText.setText(prefs.getString("weather_desp", ""));          publishText.setText("今天" + prefs.getString("publish_time", "") + "发布");          currentDateText.setText(prefs.getString("current_date", ""));          weatherInfoLayout.setVisibility(View.VISIBLE);          cityNameText.setVisibility(View.VISIBLE);          Intent intent = new Intent(this, AutoUpdateService.class);          startService(intent);      }    }    <pre name="code" class="java"><span style="color:#6666CC;">ChooseAreaActivity.java</span></pre><pre name="code" class="java">public class ChooseAreaActivity extends Activity {        public static final int LEVEL_PROVINCE = 0;      public static final int LEVEL_CITY = 1;      public static final int LEVEL_COUNTY = 2;        private ProgressDialog progressDialog;      private TextView titleText;      private ListView listView;      private ArrayAdapter<String> adapter;      private CoolWeatherDB coolWeatherDB;      private List<String> dataList = new ArrayList<String>();      /**      * 省列表      */      private List<Province> provinceList;      /**      * 市列表      */      private List<City> cityList;      /**      * 县列表      */      private List<County> countyList;      /**      * 选中的省份      */      private Province selectedProvince;      /**      * 选中的城市      */      private City selectedCity;      /**      * 当前选中的级别      */      private int currentLevel;      /**      * 是否从WeatherActivity中跳转过来。      */      private boolean isFromWeatherActivity;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          isFromWeatherActivity = getIntent().getBooleanExtra(                  "from_weather_ activity", false);          SharedPreferences prefs = PreferenceManager                  .getDefaultSharedPreferences(this);          // 已经选择了城市且不是从WeatherActivity跳转过来,才会直接跳转到WeatherActivity          if (prefs.getBoolean("city_selected", false) && !isFromWeatherActivity) {              Intent intent = new Intent(this, WeatherActivity.class);              startActivity(intent);              finish();              return;          }            requestWindowFeature(Window.FEATURE_NO_TITLE);          setContentView(R.layout.choose_area);          listView = (ListView) findViewById(R.id.list_view);          titleText = (TextView) findViewById(R.id.title_text);          adapter = new ArrayAdapter<String>(this,                  android.R.layout.simple_list_item_1, dataList);          listView.setAdapter(adapter);          coolWeatherDB = CoolWeatherDB.getInstance(this);          listView.setOnItemClickListener(new OnItemClickListener() {              @Override              public void onItemClick(AdapterView<?> arg0, View view, int index,                      long arg3) {                  if (currentLevel == LEVEL_PROVINCE) {                      selectedProvince = provinceList.get(index);                      queryCities();                  } else if (currentLevel == LEVEL_CITY) {                      selectedCity = cityList.get(index);                      queryCounties();                  } else if (currentLevel == LEVEL_COUNTY) {                      String countyCode = countyList.get(index).getCountyCode();                      Intent intent = new Intent(ChooseAreaActivity.this,                              WeatherActivity.class);                      intent.putExtra("county_code", countyCode);                      startActivity(intent);                      finish();                  }              }          });          queryProvinces(); // 加载省级数据      }        /**      * 查询全国所有的省,优先从数据库查询,如果没有查询到再去服务器上查询。      */      private void queryProvinces() {          provinceList = coolWeatherDB.loadProvinces();          if (provinceList.size() > 0) {              dataList.clear();              for (Province province : provinceList) {                  dataList.add(province.getProvinceName());              }              adapter.notifyDataSetChanged();              listView.setSelection(0);              titleText.setText("中国");              currentLevel = LEVEL_PROVINCE;          } else {              queryFromServer(null, "province");          }      }        /**      * 查询选中省内所有的市,优先从数据库查询,如果没有查询到再去服务器上查询。      */      private void queryCities() {          cityList = coolWeatherDB.loadCities(selectedProvince.getId());          if (cityList.size() > 0) {              dataList.clear();              for (City city : cityList) {                  dataList.add(city.getCityName());              }              adapter.notifyDataSetChanged();              listView.setSelection(0);              titleText.setText(selectedProvince.getProvinceName());              currentLevel = LEVEL_CITY;          } else {              queryFromServer(selectedProvince.getProvinceCode(), "city");          }      }        /**      * 查询选中市内所有的县,优先从数据库查询,如果没有查询到再去服务器上查询。      */      private void queryCounties() {          countyList = coolWeatherDB.loadCounties(selectedCity.getId());          if (countyList.size() > 0) {              dataList.clear();              for (County county : countyList) {                  dataList.add(county.getCountyName());              }              adapter.notifyDataSetChanged();              listView.setSelection(0);              titleText.setText(selectedCity.getCityName());              currentLevel = LEVEL_COUNTY;          } else {              queryFromServer(selectedCity.getCityCode(), "county");          }      }        /**      * 根据传入的代号和类型从服务器上查询省市县数据。      */      private void queryFromServer(final String code, final String type) {          String address;          if (!TextUtils.isEmpty(code)) {              address = "http://www.weather.com.cn/data/list3/city" + code                      + ".xml";          } else {              address = "http://www.weather.com.cn/data/list3/city.xml";          }          showProgressDialog();          HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {              @Override              public void onFinish(String response) {                  boolean result = false;                  if ("province".equals(type)) {                      result = Utility.handleProvincesResponse(coolWeatherDB,                              response);                  } else if ("city".equals(type)) {                      result = Utility.handleCitiesResponse(coolWeatherDB,                              response, selectedProvince.getId());                  } else if ("county".equals(type)) {                      result = Utility.handleCountiesResponse(coolWeatherDB,                              response, selectedCity.getId());                  }                  if (result) {                      // 通过runOnUiThread()方法回到主线程处理逻辑                      runOnUiThread(new Runnable() {                          @Override                          public void run() {                              closeProgressDialog();                              if ("province".equals(type)) {                                  queryProvinces();                              } else if ("city".equals(type)) {                                  queryCities();                              } else if ("county".equals(type)) {                                  queryCounties();                              }                          }                      });                  }              }                @Override              public void onError(Exception e) {                  // 通过runOnUiThread()方法回到主线程处理逻辑                  runOnUiThread(new Runnable() {                      @Override                      public void run() {                          closeProgressDialog();                          Toast.makeText(ChooseAreaActivity.this, "加载失败",                                  Toast.LENGTH_SHORT).show();                      }                  });              }          });      }        /**      * 显示进度对话框      */      private void showProgressDialog() {          if (progressDialog == null) {              progressDialog = new ProgressDialog(this);              progressDialog.setMessage("正在加载...");              progressDialog.setCanceledOnTouchOutside(false);          }          progressDialog.show();      }        /**      * 关闭进度对话框      */      private void closeProgressDialog() {          if (progressDialog != null) {              progressDialog.dismiss();          }      }        /**      * 捕获Back按键,根据当前的级别来判断,此时应该返回市列表、省列表、还是直接退出。      */      @Override      public void onBackPressed() {          if (currentLevel == LEVEL_COUNTY) {              queryCities();          } else if (currentLevel == LEVEL_CITY) {              queryProvinces();          } else {              if (isFromWeatherActivity) {                  Intent intent = new Intent(this, WeatherActivity.class);                  startActivity(intent);              }              finish();          }      }    }</pre><span style="color:#FF0000">weather_layout.java</span><br>  <pre name="code" class="java"><?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" >      <RelativeLayout          android:layout_width="match_parent"          android:layout_height="50dp"          android:background="#484E61" >            <Button              android:id="@+id/switch_city"              android:layout_width="30dp"              android:layout_height="30dp"              android:layout_centerVertical="true"              android:layout_marginLeft="10dp"              android:background="@drawable/home" />            <TextView              android:id="@+id/city_name"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_centerInParent="true"              android:textColor="#fff"              android:textSize="24sp" />           <Button              android:id="@+id/refresh_weather"              android:layout_width="30dp"              android:layout_height="30dp"              android:layout_alignParentRight="true"              android:layout_centerVertical="true"              android:layout_marginRight="10dp"              android:background="@drawable/refresh" />      </RelativeLayout>        <RelativeLayout          android:layout_width="match_parent"          android:layout_height="0dp"          android:layout_weight="1"          android:background="#27A5F9" >            <TextView              android:id="@+id/publish_text"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentRight="true"              android:layout_marginRight="10dp"              android:layout_marginTop="10dp"              android:textColor="#FFF"              android:textSize="18sp" />            <LinearLayout              android:id="@+id/weather_info_layout"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_centerInParent="true"              android:orientation="vertical" >                <TextView                  android:id="@+id/current_date"                  android:layout_width="wrap_content"                  android:layout_height="40dp"                  android:gravity="center"                  android:textColor="#FFF"                  android:textSize="18sp" />                <TextView                  android:id="@+id/weather_desp"                  android:layout_width="wrap_content"                  android:layout_height="60dp"                  android:layout_gravity="center_horizontal"                  android:gravity="center"                  android:textColor="#FFF"                  android:textSize="40sp" />                <LinearLayout                  android:layout_width="wrap_content"                  android:layout_height="60dp"                  android:layout_gravity="center_horizontal"                  android:orientation="horizontal" >                    <TextView                      android:id="@+id/temp1"                      android:layout_width="wrap_content"                      android:layout_height="wrap_content"                      android:layout_gravity="center_vertical"                      android:textColor="#FFF"                      android:textSize="40sp" />                    <TextView                      android:layout_width="wrap_content"                      android:layout_height="wrap_content"                      android:layout_gravity="center_vertical"                      android:layout_marginLeft="10dp"                      android:layout_marginRight="10dp"                      android:text="~"                      android:textColor="#FFF"                      android:textSize="40sp" />                    <TextView                      android:id="@+id/temp2"                      android:layout_width="wrap_content"                      android:layout_height="wrap_content"                      android:layout_gravity="center_vertical"                      android:textColor="#FFF"                      android:textSize="40sp" />              </LinearLayout>          </LinearLayout>      </RelativeLayout>    </LinearLayout>  </pre><br>  <br>  <pre></pre>  <h2><a name="t4"></a>三、出现的问题</h2>  <p>由于没能找到“刷新”和“返回”的图标,随手找到两个两个图片就应用上了。</p>  <p>文字排版歪了。<br>  </p>  <pre name="code" class="java"><p></p><pre></pre>  <pre></pre>       </pre>  



3.实验总结

该实验中需编辑代码较多,编译时出现些许问题,经过改正粗略解决。实验需要用到网络中的实时信息,是实验的另一难点。通过此次实验,对安卓有了进一步了解。
0 0
原创粉丝点击