Android-app-DwWeather天气预报

来源:互联网 发布:sql server 2008怎么用 编辑:程序博客网 时间:2024/05/16 06:16

这个Demo可以从全国天气预报网上获取实时天气信息,能够显示省、市、县级的天气情况。主要涉及的知识点有数据库的使用、JSON数据的解析、Service、广播的使用以及MVC设计模式的应用,详情见源码。
一、布局文件

1.weather_layout.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" >    <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="@android:drawable/ic_input_get"            ></Button>        <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_centerVertical="true"            android:layout_alignParentRight="true"            android:layout_marginRight="10dp"            android:background="@android:drawable/ic_menu_rotate"            ></Button>    </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>

2.choose_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" >    <RelativeLayout         android:layout_width="match_parent"        android:layout_height="50dp"        android:background="#484E61">        <TextView             android:id="@+id/title_text"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:textColor="#fff"            android:textSize="24sp"/>    </RelativeLayout>    <ListView         android:id="@+id/list_view"        android:layout_width="match_parent"        android:layout_height="match_parent">    </ListView></LinearLayout>

二、界面

1.ChooseAreaActivity.java

package com.dw.dwweather.activity;import java.util.ArrayList;import java.util.List;import com.dw.dwweather.db.DwWeatherDB;import com.dw.dwweather.model.City;import com.dw.dwweather.model.County;import com.dw.dwweather.model.Province;import com.dw.dwweather.util.HttpCallbackListener;import com.dw.dwweather.util.HttpUtil;import com.dw.dwweather.util.Utility;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.preference.PreferenceManager;import android.text.TextUtils;import android.view.View;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;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 DwWeatherDB dwWeatherDB;    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;    private boolean isFromWeatherActivity;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        isFromWeatherActivity=getIntent().getBooleanExtra("from_weather_activity", false);        SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);        //已经选择了城市而且不是从weatherActivity跳转过来,才会直接跳转到Weather、Activity        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);        dwWeatherDB=DwWeatherDB.getInstance(this);        listView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> arg0, View view, int index,                    long arg3) {                // TODO Auto-generated met                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() {        // TODO Auto-generated method stub        System.out.println("进入queryProvince方法");        provinceList = dwWeatherDB.loadProvinces();        System.out.println(provinceList.size()+"----------");        if (provinceList.size() > 0) {            dataList.clear();            for (Province province : provinceList) {                dataList.add(province.getProvinceName());                System.out.println(dataList.toString());            }            adapter.notifyDataSetChanged();// 刷新            listView.setSelection(0);            titleText.setText("中国");            currentLevel = LEVEL_PROVINCE;        } else {            queryFromServer(null, "province");            System.out.println("服务器查询方法执行完毕");        }        System.out.println("queryProvince方法执行完毕");    }    /**     * 查询全国所有的市,优先从数据库查询,如果数据库上没有查询到再去服务器上查询     */    private void queryCities() {        // TODO Auto-generated method stub        cityList = dwWeatherDB.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() {        // TODO Auto-generated method stub        countyList = dwWeatherDB.loadCounties(selectedCity.getId());        if (countyList.size() > 0) {            dataList.clear();            for (County county : countyList) {                dataList.add(county.getCountyName());            }            adapter.notifyDataSetChanged();// 刷新            listView.setSelection(0);            titleText.setText(selectedProvince.getProvinceName());            currentLevel = LEVEL_CITY;        } else {            queryFromServer(selectedCity.getCityCode(), "county");        }    }    /**     * 根据传入的代号和类型从服务器上查询市县数据     *      * @param object     * @param string     */    private void queryFromServer(final String code, final String type) {        // TODO Auto-generated method stub        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) {                // TODO Auto-generated method stub                boolean result = false;                if ("province".equals(type)) {                    result = Utility.handleProvincesResponse(dwWeatherDB,                            response);                } else if ("city".equals(type)) {                    result = Utility.handleCitiesResponse(dwWeatherDB,                            response, selectedProvince.getId());                } else if ("county".equals(type)) {                    result = Utility.handleCountiesResponse(dwWeatherDB,                            response, selectedCity.getId());                }                if (result) {                    // 通过runOnUiThread方法回到主线程处理逻辑                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            // TODO Auto-generated method stub                            closeProgressDialog();                            if ("province".equals(type)) {                                queryProvinces();                            } else if ("city".equals(type)) {                                queryCities();                            } else if ("county".equals(type)) {                                queryCounties();                            }                        }                    });                }            }            @Override            public void onError(Exception e) {                // TODO Auto-generated method stub                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // TODO Auto-generated method stub                        closeProgressDialog();                        Toast.makeText(ChooseAreaActivity.this, "加载失败!",                                Toast.LENGTH_SHORT).show();                    }                });            }        });    }    /**     * 显示加载进度     */    private void showProgressDialog() {        // TODO Auto-generated method stub        if (progressDialog == null) {            progressDialog = new ProgressDialog(this);            progressDialog.setMessage("正在玩命加载...");            progressDialog.setCanceledOnTouchOutside(false);        }        progressDialog.show();    }    private void closeProgressDialog() {        if (progressDialog != null) {            progressDialog.dismiss();        }    }    /**     * 根据当前的级别来判断是返回市列表、省列表还是直接退出     */    @Override    public void onBackPressed() {        // TODO Auto-generated method stub        if (currentLevel == LEVEL_COUNTY) {            queryCities();        } else if (currentLevel == LEVEL_CITY) {            queryProvinces();        } else {            if(isFromWeatherActivity){                Intent intent=new Intent(this, WeatherActivity.class);                startActivity(intent);            }            finish();        }    }}

2.WeatherActivity.java

package com.dw.dwweather.activity;import com.dw.dwweather.service.AutoUpdateService;import com.dw.dwweather.util.HttpCallbackListener;import com.dw.dwweather.util.HttpUtil;import com.dw.dwweather.util.Utility;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.preference.PreferenceManager;import android.text.TextUtils;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;public class WeatherActivity extends Activity implements OnClickListener {    private LinearLayout weatherInfoLayout;    private TextView cityNameText;    private TextView publishText;    private TextView weatherDespText;    private TextView temp1Text;    private TextView temp2Text;    private TextView curretnDateText;    private Button switchCity;    private Button refreshWeather;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        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);        curretnDateText=(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);        }        switchCity.setOnClickListener(this);        refreshWeather.setOnClickListener(this);    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        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;        }    }    /**     * 查询天气代号所对应的天气     * @param countyCode     */    private void queryWeatherCode(String countyCode) {        // TODO Auto-generated method stub        String address="http://www.weather.com.cn/data/list3/city"+countyCode+".xml";        queryFromServer(address,"countyCode");    }    /**     * 查询县级代号对应的天气     * @param weatherCode     */    private void queryWeatherInfo(String weatherCode) {        // TODO Auto-generated method stub        String address="http://www.weather.com.cn/data/cityinfo"+weatherCode+".html";        queryFromServer(address,"weatherCode");    }    /**     * 根据传入的地址和类型向服务器查询天气代号或者天气信息     * @param address     * @param string     */    private void queryFromServer(final String address, final String type) {        // TODO Auto-generated method stub        HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {            @Override            public void onFinish(final String response) {                // TODO Auto-generated method stub                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() {                            // TODO Auto-generated method stub                            showWeather();                        }                    });                }            }            @Override            public void onError(Exception e) {                // TODO Auto-generated method stub                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // TODO Auto-generated method stub                        publishText.setText("同步失败");                    }                });            }        });    }    /**     * 从sharedPreferences中读取存储的天气信息,并显示到界面上     */    private void showWeather() {        // TODO Auto-generated method stub        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", "")+"发布");        curretnDateText.setText(prefs.getString("current_date", ""));        weatherInfoLayout.setVisibility(View.INVISIBLE);        cityNameText.setVisibility(View.INVISIBLE);        Intent intent=new Intent(this, AutoUpdateService.class);        startService(intent);    }}

三、数据库操作

1.DwWeatherOpenHelper.java

package com.dw.dwweather.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DwWeatherOpenHelper extends SQLiteOpenHelper {    public DwWeatherOpenHelper(Context context, String name,            CursorFactory factory, int version) {        super(context, name, factory, version);        // TODO Auto-generated constructor stub    }    public static final String CREATE_PROVINCE="create table Province ("            +"id integer primary key autoincrement,"            +"province_name text,"            +"province_code text)";    public static final String CREATE_CITY="create table City ("            +"id integer primary key autoincrement,"            +"city_name text,"            +"city_code text"            +"city_id integer)";    public static final String CREATE_COUNTY="create table County ("            +"id integer primary key autoincrement,"            +"county_name text,"            +"county_code text"            +"city_id integer)";    @Override    public void onCreate(SQLiteDatabase db) {        // TODO Auto-generated method stub        db.execSQL(CREATE_PROVINCE);        db.execSQL(CREATE_CITY);        db.execSQL(CREATE_COUNTY);    }    @Override    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {        // TODO Auto-generated method stub    }}

2.DwWeatherDB.java

package com.dw.dwweather.db;import java.util.ArrayList;import java.util.List;import com.dw.dwweather.model.City;import com.dw.dwweather.model.County;import com.dw.dwweather.model.Province;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class DwWeatherDB {    public static final String DB_NAME="dw_weather";    public static final int VERSION=1;    private static DwWeatherDB dwWeatherDB;    private SQLiteDatabase db;    /**     * 构造方法私有化     * @param context     */    private DwWeatherDB(Context context) {        // TODO Auto-generated constructor stub        DwWeatherOpenHelper dbHelper=new DwWeatherOpenHelper(context, DB_NAME, null, VERSION);        db=dbHelper.getWritableDatabase();    }    /**     * 获取DwWeatherDB实例     * @param context     * @return     */    public synchronized static DwWeatherDB getInstance(Context context){        if(dwWeatherDB==null){            dwWeatherDB=new DwWeatherDB(context);        }        return dwWeatherDB;    }    /**     * 将Province实例存储到数据库     * @param province     */    public void saveProvince(Province province){        if(province!=null){            ContentValues values=new ContentValues();            values.put("province_name", province.getProvinceName());            values.put("province_code", province.getProvinceCode());            db.insert("Province", null, values);        }    }    /**     * 从数据库获取全国所有的省份信息     * @return     */    public List<Province> loadProvinces(){        System.out.println("进入loadProvinces方法");        List<Province> list=new ArrayList<Province>();        Cursor cursor=db.query("Province", null, null, null, null, null, null);        if(cursor.moveToFirst()){            do {                Province province=new Province();                province.setId(cursor.getInt(cursor.getColumnIndex("id")));                province.setProvinceName(cursor.getString(cursor.getColumnIndex("province_name")));                province.setProvinceCode(cursor.getString(cursor.getColumnIndex("province_code")));                list.add(province);            } while (cursor.moveToNext());        }        System.out.println("loadProvinces方法执行完毕");        return list;    }    /**     * 将City实例存储到数据库     * @param province     */    public void saveCity(City city){        if(city!=null){            ContentValues values=new ContentValues();            values.put("city_name", city.getCityName());            values.put("city_code", city.getCityCode());            values.put("province_id", city.getProvinceId());            db.insert("City", null, values);        }    }    /**     * 从数据库读取某省份下所有的城市信息     * @param provinceId     * @return     */    public List<City> loadCities(int provinceId){        List<City> list=new ArrayList<City>();        Cursor cursor=db.query("City", null, "province_id=?",                 new String[]{String.valueOf(provinceId)}, null,null,null);        if(cursor.moveToFirst()){            do {                City city=new City();                city.setId(cursor.getInt(cursor.getColumnIndex("id")));                city.setCityName(cursor.getString(cursor.getColumnIndex("city_name")));                city.setCityCode(cursor.getString(cursor.getColumnIndex("city_code")));                city.setProvinceId(provinceId);                list.add(city);            } while (cursor.moveToNext());        }        return list;    }    /**     * 将County实例存储到数据库     * @param province     */    public void saveCounty(County county){        if(county!=null){            ContentValues values=new ContentValues();            values.put("county_name", county.getCountyName());            values.put("county_code", county.getCountyCode());            values.put("city_id", county.getCityId());            db.insert("County", null, values);        }    }    /**     * 从数据库读取某省份下某城市下所有县城信息     * @param provinceId     * @return     */    public List<County> loadCounties(int cityId){        List<County> list=new ArrayList<County>();        Cursor cursor=db.query("County", null, "city_id=?",                 new String[]{String.valueOf(cityId)}, null,null,null);        if(cursor.moveToFirst()){            do {                County county=new County();                county.setId(cursor.getInt(cursor.getColumnIndex("id")));                county.setCountyName(cursor.getString(cursor.getColumnIndex("county_name")));                county.setCountyCode(cursor.getString(cursor.getColumnIndex("county_code")));                county.setCityId(cityId);                list.add(county);            } while (cursor.moveToNext());        }        return list;    }}

四、地区模型层
1.City.java

package com.dw.dwweather.model;public class City {    private int id;    private String cityName;    private String cityCode;    private int provinceId;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getCityName() {        return cityName;    }    public void setCityName(String cityName) {        this.cityName = cityName;    }    public String getCityCode() {        return cityCode;    }    public void setCityCode(String cityCode) {        this.cityCode = cityCode;    }    public int getProvinceId() {        return provinceId;    }    public void setProvinceId(int provinceId) {        this.provinceId = provinceId;    }}

2.County.java

package com.dw.dwweather.model;public class County {    private int id;    private int cityId;    private String countyName;    private String countyCode;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public int getCityId() {        return cityId;    }    public void setCityId(int cityId) {        this.cityId = cityId;    }    public String getCountyName() {        return countyName;    }    public void setCountyName(String countyName) {        this.countyName = countyName;    }    public String getCountyCode() {        return countyCode;    }    public void setCountyCode(String countyCode) {        this.countyCode = countyCode;    }}

3.Province.java

package com.dw.dwweather.model;public class Province {    private int id;    private String provinceName;    private String provinceCode;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getProvinceName() {        return provinceName;    }    public void setProvinceName(String provinceName) {        this.provinceName = provinceName;    }    public String getProvinceCode() {        return provinceCode;    }    public void setProvinceCode(String provinceCode) {        this.provinceCode = provinceCode;    }}

五、更新广播与更新服务
1.AutoUpdateReceiver.java

package com.dw.dwweather.receiver;import com.dw.dwweather.service.AutoUpdateService;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class AutoUpdateReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // TODO Auto-generated method stub        Intent i=new Intent(context, AutoUpdateService.class);        context.startService(i);    }}

2.AutoUpdateService.java

package com.dw.dwweather.service;import com.dw.dwweather.receiver.AutoUpdateReceiver;import com.dw.dwweather.util.HttpCallbackListener;import com.dw.dwweather.util.HttpUtil;import com.dw.dwweather.util.Utility;import android.app.AlarmManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.content.SharedPreferences;import android.os.IBinder;import android.os.SystemClock;import android.preference.PreferenceManager;public class AutoUpdateService extends Service {    @Override    public IBinder onBind(Intent arg0) {        // TODO Auto-generated method stub        return null;    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        // TODO Auto-generated method stub        new Thread(new Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub                updateWeather();            }        }).start();        AlarmManager manager=(AlarmManager) getSystemService(ALARM_SERVICE);        int time=8*60*60*1000;        long triggerAtTime=SystemClock.elapsedRealtime()+time;        Intent i=new Intent(this, AutoUpdateReceiver.class);        PendingIntent pi=PendingIntent.getBroadcast(this, 0, i, 0);        manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);        return super.onStartCommand(intent, flags, startId);    }/** * 更新天气信息 */    private void updateWeather() {        // TODO Auto-generated method stub        SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this);        String weatherCode=prefs.getString("weather_code", "");        String address="http://www.weather.com.cn/data/cityinfo/"+weatherCode+".html";        HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {            @Override            public void onFinish(String response) {                // TODO Auto-generated method stub                Utility.handleWeatherResponse(AutoUpdateService.this, response);            }            @Override            public void onError(Exception e) {                // TODO Auto-generated method stub                e.printStackTrace();            }        });    }}

六、工具类
1.HttpCallbackListener.java

package com.dw.dwweather.util;public interface HttpCallbackListener {    void onFinish(String response);    void onError(Exception e);}

2.HttpUtil.java

package com.dw.dwweather.util;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class HttpUtil {    public static void sendHttpRequest(final String address,final HttpCallbackListener listener){        new Thread(new Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub                HttpURLConnection connection=null;                try {                    URL url=new URL(address);                    connection=(HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    InputStream in=connection.getInputStream();                    BufferedReader reader=new BufferedReader(new InputStreamReader(in));                    StringBuilder response=new StringBuilder();                    String line;                    while (listener!=null) {                        //回调onFinish方法                        listener.onFinish(response.toString());                    }                } catch (Exception e) {                    // TODO: handle exception                    if(listener!=null){                        listener.onError(e);                    }                }finally{                    if(connection!=null){                        connection.disconnect();                    }                }            }        }).start();    }}

3.Utility.java

package com.dw.dwweather.util;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import org.json.JSONException;import org.json.JSONObject;import android.content.Context;import android.content.SharedPreferences;import android.preference.PreferenceManager;import android.text.TextUtils;import com.dw.dwweather.db.DwWeatherDB;import com.dw.dwweather.model.City;import com.dw.dwweather.model.County;import com.dw.dwweather.model.Province;public class Utility {    /**     * 解析和处理服务器返回的省级数据     */    public synchronized static boolean handleProvincesResponse(            DwWeatherDB dwWeatherDB, String response) {        if (!TextUtils.isEmpty(response)) {            String[] allProvinces = response.split(",");            if (allProvinces != null && allProvinces.length > 0) {                for (String p : allProvinces) {                    String[] array = p.split("\\|");                    Province province = new Province();                    province.setProvinceCode(array[0]);                    province.setProvinceName(array[1]);                    // 将解析处理的数据存储到Procince表                    dwWeatherDB.saveProvince(province);                }                return true;            }        }        return false;    }    /**     * 解析和处理服务器返回的市级数据     */    public synchronized static boolean handleCitiesResponse(            DwWeatherDB dwWeatherDB, String response, int provinceId) {        if (!TextUtils.isEmpty(response)) {            String[] allCities = response.split(",");            if (allCities != null && allCities.length > 0) {                for (String c : allCities) {                    String[] array = c.split("\\|");                    City city = new City();                    city.setCityCode(array[0]);                    city.setCityName(array[1]);                    city.setProvinceId(provinceId);                    // 将解析处理的数据存储到Procince表                    dwWeatherDB.saveCity(city);                }                return true;            }        }        return false;    }    /**     * 解析和处理服务器返回的级数据     */    public synchronized static boolean handleCountiesResponse(            DwWeatherDB dwWeatherDB, String response, int cityId) {        if (!TextUtils.isEmpty(response)) {            String[] allCounties = response.split(",");            if (allCounties != null && allCounties.length > 0) {                for (String c : allCounties) {                    String[] array = c.split("\\|");                    County county = new County();                    county.setCountyCode(array[0]);                    county.setCountyName(array[1]);                    county.setCityId(cityId);                    // 将解析处理的数据存储到Procince表                    dwWeatherDB.saveCounty(county);                }                return true;            }        }        return false;    }    /**     * 解析服务器返回的json数据,并将解析处理的数据存储到本地     */    public static void handleWeatherResponse(Context context, String response) {        try {            JSONObject jsonObject = new JSONObject(response);            JSONObject weatherInfo = jsonObject.getJSONObject("weatherinfo");            String cityName = weatherInfo.getString("city");            String weatherCode = weatherInfo.getString("cityid");            String temp1 = weatherInfo.getString("temp1");            String temp2 = weatherInfo.getString("temp2");            String weatherDesp = weatherInfo.getString("weather");            String publishTime = weatherInfo.getString("ptime");            saveWeatherInfo(context, cityName, weatherCode, temp1, temp2,                    weatherDesp, publishTime);        } catch (JSONException e) {            // TODO: handle exception            e.printStackTrace();        }    }    /**     * 将服务器返回的所有天气信息存储到sharedPreference文件     *      * @param context     * @param cityName     * @param weatherCode     * @param temp1     * @param temp2     * @param weatherDesp     * @param publishTime     */    public static void saveWeatherInfo(Context context, String cityName,            String weatherCode, String temp1, String temp2, String weatherDesp,            String publishTime) {        // TODO Auto-generated method stub        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日", Locale.CHINA);        SharedPreferences.Editor editor = PreferenceManager                .getDefaultSharedPreferences(context).edit();        editor.putBoolean("city_selected", true);        editor.putString("city_name", cityName);        editor.putString("weather_code", weatherCode);        editor.putString("temp1", temp1);        editor.putString("temp2", temp2);        editor.putString("weather_desp", weatherDesp);        editor.putString("publish_time", publishTime);        editor.putString("current_date", sdf.format(new Date()));        editor.commit();    }}

完整项目见Github (https://github.com/Arthur0213/DwWeather)

0 0
原创粉丝点击