写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
import android.app.Application;
public class MyApplication extends Application {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
JuheSDKInitializer.initialize(getApplicationContext());
}
}
MyApplication.java
package com.onlyloveyd.weather;
import android.app.Application;
import com.thinkland.sdk.android.JuheSDKInitializer;
public class MyApplication extends Application {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
JuheSDKInitializer.initialize(getApplicationContext());//初始化Juhe数据SDK
}
}
城市选择界面
ChooseCityActivity.java
package com.onlyloveyd.weather;
import ......;
public class ChooseCityActivity extends Activity {
public static final String TAG = "ChooseCityActivity";
@Bind(R.id.tv_choose_city_title)
TextView tvChooseCityTitle;
@Bind(R.id.et_search_city)
EditText etSearchCity;
@Bind(R.id.tv_hotcity)
TextView tvHotcity;
@Bind(R.id.gv_hotcity)
GridView gvHotcity;
private ArrayList<CityItem> mSupportCityList;//所有城市List
private ArrayList<CityItem> mSearchCityList;//城市查询结果List
private CityAdapter mCityAdapter;//城市GridView的Adapter
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.citylist);//城市选择界面
ButterKnife.bind(this);//依赖注入
mSupportCityList = new ArrayList<CityItem>();
mSearchCityList = new ArrayList<CityItem>();
//设置带shape模式的编辑框的背景颜色
//GradientDrawable myGrad = (GradientDrawable)mSearchEditView.getBackground();
//myGrad.setColor(getResources().getColor(R.color.choosecitysearchbackground));
//给城市名编译框添加文本变化的观察者
etSearchCity.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mSearchCityList.clear();//城市查询结果list清空
String searchkey = charSequence.toString();
Log.e(TAG, " city size " + mSupportCityList.size());
for (int j = 0; j < mSupportCityList.size(); j++) {
CityItem item = mSupportCityList.get(j);
if (searchkey.contains(item.getDistrict()) || item.getDistrict().contains(searchkey)) {//遍历查询
mSearchCityList.add(item);
}
}
mCityAdapter.setCityList(mSearchCityList);
mCityAdapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
mCityAdapter = new CityAdapter(this, mSupportCityList);
gvHotcity.setAdapter(mCityAdapter);
getSupportCity(this);
}
private void getSupportCity(Context context) {
/**Juhe SDK 封装的方法 * 请求的方法 参数: 第一个参数 当前请求的context 第二个参数 接口id 第三二个参数 接口请求的url 第 四个参数 接口请求的方式 * 第五个参数 接口请求的参数,键值对com.thinkland.sdk.android.Parameters类型; 第六个参数 * 请求的回调方法,com.thinkland.sdk.android.DataCallBack; * */
JuheData.executeWithAPI(context, 39, "http://v.juhe.cn/weather/citys", JuheData.GET, null, new DataCallBack() {
@Override
public void onSuccess(int statusCode, String responseString) {
try {
//解析JSON数据
JSONObject jsonObject = new JSONObject(responseString);
JSONArray result = jsonObject.getJSONArray("result");
for (int i = 0; i < result.length(); i++) {
JSONObject object = (JSONObject) result.get(i);
CityItem item = new CityItem(object.getString("id"), object.getString("province"), object.getString("city"), object.getString("district"));
mSupportCityList.add(item);//查询结果添加
mCityAdapter.notifyDataSetChanged();//notify数据变化
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFinish() {
}
@Override
public void onFailure(int statusCode, String responseString, Throwable throwable) {
Log.e(TAG, responseString);
}
});
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
etSearchCity.setText(null);//避免onBackPress的时候编辑框中还有数据
super.onPause();
}
}
聚合数据针对支持的城市返回的JSON数据格式为
{
“resultcode”:”200”,
“reason”:”successed”,
“result”:[
{
“id”:”1”, /城市ID/
“province”:”北京”,/省份名称/
“city”:”北京”, /城市/
“district”:”北京” /城市/区名称/
},
{
“id”:”2”,
“province”:”北京”,
“city”:”北京”,
“district”:”海淀”
},
}
}
按照这种格式解析出JSON数据
//天气显示界面
WeatherActivity.java
package com.onlyloveyd.weather;
import XXXX;
public class WeatherActivity extends Activity {
private static final String TAG = "MainActivity";
@Bind(R.id.imageview)
ImageView imageview;
@Bind(R.id.tv_cityname)
TextView tvCityname;
@Bind(R.id.tv_date)
TextView tvDate;
@Bind(R.id.iv_zhengfu)
ImageView ivZhengfu;
@Bind(R.id.iv_tenth)
ImageView ivTenth;
@Bind(R.id.iv_geth)
ImageView ivGeth;
@Bind(R.id.iv_du)
ImageView ivDu;
@Bind(R.id.iv_weather_fa)
ImageView ivWeatherFa;
@Bind(R.id.tv_weather)
TextView tvWeather;
@Bind(R.id.iv_weather_fb)
ImageView ivWeatherFb;
@Bind(R.id.tv_temp)
TextView tvTemp;
@Bind(R.id.tv_humidity)
TextView tvHumidity;
@Bind(R.id.tv_wind)
TextView tvWind;
@Bind(R.id.tv_refreshtime)
TextView tvRefreshtime;
@Bind(R.id.gv_future)
GridView gvFuture;
WeatherInfo.ResultBean.SkBean mSk;
WeatherInfo.ResultBean.TodayBean mToday;
FutureAdapter mFutureAdapter;
ArrayList<WeatherInfo.ResultBean.FutureBean> mFutureList;
private Context mContext;
private String mCityName = null;
/** * Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.weather);
ButterKnife.bind(this);//依赖注入
Intent intent = getIntent();
mCityName = intent.getStringExtra("cityname");//从选择城市界面选择城市传递到这个Activity
mFutureList = new ArrayList<WeatherInfo.ResultBean.FutureBean>();//未来7天预报的List
mFutureAdapter = new FutureAdapter(this, mFutureList);//未来天气预报的GridView的Adapter
gvFuture.setAdapter(mFutureAdapter);
}
@Override
protected void onResume() {
super.onResume();
mFutureList.clear();
getWeatherInfoByCity(this, mCityName);//查询天气信息,包含的内容比较多,速度还算快,没有单独使用线程
tvCityname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();
}
});
}
private void getWeatherInfoByCity(Context context, String city) {
Log.e(TAG, "getWeatherInfoByCity");
Parameters param = new Parameters();
param.add("cityname", city);
param.add("format", 2);
JuheData.executeWithAPI(context, 39, "http://v.juhe.cn/weather/index", JuheData.GET, param, new DataCallBack() {
@Override
public void onSuccess(int statusCode, String responseString) {
Gson gson = new Gson();
try {
JSONObject jsonObject = new JSONObject(responseString);
JSONObject resultjson = jsonObject.getJSONObject("result");
JSONObject skjson = resultjson.getJSONObject("sk");
JSONObject todayjson = resultjson.getJSONObject("today");
JSONArray futurejson = resultjson.getJSONArray("future");
mSk = gson.fromJson(skjson.toString(), WeatherInfo.ResultBean.SkBean.class);
mToday = gson.fromJson(todayjson.toString(), WeatherInfo.ResultBean.TodayBean.class);
Log.e(TAG, futurejson.get(2).toString());
for (int i = 0; i < futurejson.length(); i++) {
WeatherInfo.ResultBean.FutureBean futureBean = gson.fromJson(futurejson.get(i).toString(), WeatherInfo.ResultBean.FutureBean.class);
Log.e(TAG, futureBean.toString());
mFutureList.add(futureBean);
}
mFutureAdapter.setmFutureList(mFutureList);
gvFuture.setAdapter(mFutureAdapter);
mFutureAdapter.notifyDataSetChanged();
tvCityname.setText(mCityName);
tvDate.setText(mToday.getDate_y() + " " + mToday.getWeek());
tvWeather.setText(mToday.getWeather());
tvTemp.setText(mToday.getTemperature());
tvHumidity.setText(mSk.getHumidity());
tvWind.setText(mSk.getWind_direction() + " " + mSk.getWind_strength());
tvRefreshtime.setText(getString(R.string.refreshtimesuffix) + mSk.getTime());
String fa = mToday.getWeather_id().getFa();
String fb = mToday.getWeather_id().getFb();
if (fa.equals(fb)) {
ivWeatherFa.setImageResource(getWeatherDrawableByWeatherId("w_", fa));
ivWeatherFb.setImageDrawable(null);
} else {
ivWeatherFa.setImageResource(getWeatherDrawableByWeatherId("w_", fa));
ivWeatherFb.setImageResource(getWeatherDrawableByWeatherId("w_", fb));
}
int tmp = Integer.valueOf(mSk.getTemp());
if (tmp < 0) {
ivZhengfu.setImageResource(R.drawable.fuhao);
int tenth = (0 - tmp) / 10;
int geth = (0 - tmp) % 10;
ivTenth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(tenth)));
ivGeth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(geth)));
} else {
ivZhengfu.setImageDrawable(null);
int tenth = tmp / 10;
int geth = tmp % 10;
ivTenth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(tenth)));
ivGeth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(geth)));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFinish() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "finish", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int statusCode, String responseString, Throwable throwable) {
// TODO Auto-generated method stub
Log.e(TAG, responseString);
}
});
}
private int getWeatherDrawableByWeatherId(String suffix, String fa) {
String res = suffix + fa;
int resid = getResources().getIdentifier(res, "drawable", getPackageName());
return resid;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
float startX = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
startX = event.getRawX();
break;
case MotionEvent.ACTION_UP:
float endX = event.getRawX();
if ((int) (endX - startX) > 10) {
onBackPressed();
}
break;
default:
break;
}
return true;
}
}
具体的内容请查阅源代码:
https://code.csdn.net/poorkick/weatherclient/tree/master
有看不懂的内容可以留言,晚上统一回复。
介绍一个Intellij插件 —– Gson Format, 通过Json格式快速生成Java Bean类,提高开发效率
其实有很多很好用的插件可供选择,不仅可以提高效率,还可以增加自己对开发的兴趣,可以去多了解一下。
谢谢。