天气预报的实现分析

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android天气预报实验报告模板 public class SetCityActivity extends Activity { //定义的一个自动定位的列表 private ListView gpsView; //定义的一个省份可伸缩性的列表 private ExpandableListView provinceList; //定义的用于过滤的文本输入框 private TextView filterText; //定义的一个记录城市码的SharedPreferences文件名 public static final String CITY_CODE_FILE="city_code"; //城市的编码 private String[][] cityCodes; //省份 private String[] groups; //对应的城市 private String[][] childs; //自定义的伸缩列表适配器 private MyListAdapter adapter; //记录应用程序widget的ID private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.set_city); gpsView = (ListView)findViewById(R.id.gps_view); provinceList= (ExpandableListView)findViewById(R.id.provinceList); //设置自动定位的适配器 gpsView.setAdapter(new GPSListAdapter(SetCityActivity.this)); //==============================GPS================================= //当单击自动定位时 gpsView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView localeCity = (TextView)view.findViewById(R.id.locateCityText); localeCity.setText("正在定位..."); final LocateHandler handler = new LocateHandler(localeCity); //添加一个线程来处理定位 new Thread(){ public void run() { Map<Integer, String> cityMap= getLocationCityInfo(); //记录匹配的城市的索引 int provinceIndex = -1; int cityIndex = -1; //传给处理类的数据封装对象 Bundle bundle = new Bundle(); if(cityMap!=null) { //得到图家名 String country = cityMap.get(LocationXMLParser.COUNTRYNAME); //只匹配中国地区的天气 if(country!=null&&country.equals("中国")){ //得到省 String province = cityMap.get(LocationXMLParser.ADMINISTRATIVEAREANAME); //得到市 String city = cityMap.get(LocationXMLParser.LOCALITYNAME); //得到区县 String towns = cityMap.get(LocationXMLParser.DEPENDENTLOCALITYNAME); Log.i("GPS", "============"+province+"."+city+"."+towns+"=============="); //将GPS定位的城市与提供能查天气的城市进行匹配 StringBuilder matchCity = new StringBuilder(city); matchCity.append("."); matchCity.append(towns); //找到省份 for(int i=0; i<groups.length; i++) { if(groups[i].equals(province)) { provinceIndex = i; break; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值