前言
寫了上一篇文章,講了下這個實(shí)現(xiàn)天氣預(yù)報(bào)的使用內(nèi)容,現(xiàn)在又到了看代碼的時候,主要還是貼代碼,然后添加足夠的注釋。
聚合數(shù)據(jù)SDK配置
- 將juhe_sdk_v_X_X.jar以及armeabi文件夾(內(nèi)包含libJuheSDK_v_X_X.so)添加到工程中l(wèi)ibs文件夾下
- 打開Moudle setting -> app -> Dependencies,添加juhe_sdk_v_X_X.jar,
- 在AndroidManifest.xml中,加入所需權(quán)限:
<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" />
- 添加所申請的openid(這個是在Juhe官網(wǎng)上申請的).在繼承Application類之后, 在AndroidManifest.xml中,加入android:name屬性,值為繼承Application的類的路徑.
- 初始化聚合數(shù)據(jù)SDK
import android.app.Application;
public class MyApplication extends Application {@Overridepublic void onCreate() {
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 {@Overridepublic void onCreate() {
super.onCreate();JuheSDKInitializer.initialize(getApplicationContext());}
}
城市選擇界面
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;
private ArrayList<CityItem> mSearchCityList;
private CityAdapter mCityAdapter;
@Overrideprotected 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>();etSearchCity.addTextChangedListener(
new TextWatcher() {
@Overridepublic void beforeTextChanged(CharSequence charSequence,
int i,
int i1,
int i2) { }
@Overridepublic void onTextChanged(CharSequence charSequence,
int i,
int i1,
int i2) {mSearchCityList.clear();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();}
@Overridepublic void afterTextChanged(Editable editable) {}});mCityAdapter =
new CityAdapter(
this, mSupportCityList);gvHotcity.setAdapter(mCityAdapter);getSupportCity(
this);}
private void getSupportCity(Context context) {
/**Juhe SDK 封裝的方法* 請求的方法 參數(shù): 第一個參數(shù) 當(dāng)前請求的context 第二個參數(shù) 接口id 第三二個參數(shù) 接口請求的url 第 四個參數(shù) 接口請求的方式* 第五個參數(shù) 接口請求的參數(shù),鍵值對com.thinkland.sdk.android.Parameters類型; 第六個參數(shù)* 請求的回調(diào)方法,com.thinkland.sdk.android.DataCallBack;* */JuheData.executeWithAPI(context,
39,
"http://v.juhe.cn/weather/citys", JuheData.GET,
null,
new DataCallBack() {
@Overridepublic void onSuccess(
int statusCode, String responseString) {
try {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();}}
catch (JSONException e) {e.printStackTrace();}}
@Overridepublic void onFinish() {}
@Overridepublic void onFailure(
int statusCode, String responseString, Throwable throwable) {Log.e(TAG, responseString);}});}
@Overrideprotected void onResume() {
super.onResume();}
@Overrideprotected void onPause() {etSearchCity.setText(
null);
super.onPause();}
}
聚合數(shù)據(jù)針對支持的城市返回的JSON數(shù)據(jù)格式為
{
“resultcode”:”200”,
“reason”:”successed”,
“result”:[
{
“id”:”1”, /城市ID/
“province”:”北京”,/省份名稱/
“city”:”北京”, /城市/
“district”:”北京” /城市/區(qū)名稱/
},
{
“id”:”2”,
“province”:”北京”,
“city”:”北京”,
“district”:”海淀”
},
}
}
按照這種格式解析出JSON數(shù)據(jù)
//天氣顯示界面
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.*/@Overridepublic 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");mFutureList =
new ArrayList<WeatherInfo.ResultBean.FutureBean>();mFutureAdapter =
new FutureAdapter(
this, mFutureList);gvFuture.setAdapter(mFutureAdapter);}
@Overrideprotected void onResume() {
super.onResume();mFutureList.clear();getWeatherInfoByCity(
this, mCityName);tvCityname.setOnClickListener(
new View.OnClickListener() {
@Overridepublic 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() {
@Overridepublic 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();}}
@Overridepublic void onFinish() {}
@Overridepublic void onFailure(
int statusCode, String responseString, Throwable throwable) {Log.e(TAG, responseString);}});}
private int getWeatherDrawableByWeatherId(String suffix, String fa) {String res = suffix + fa;
int resid = getResources().getIdentifier(res,
"drawable", getPackageName());
return resid;}
@Overridepublic 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;}
}
具體的內(nèi)容請查閱源代碼:
https://code.csdn.net/poorkick/weatherclient/tree/master
有看不懂的內(nèi)容可以留言,晚上統(tǒng)一回復(fù)。
介紹一個Intellij插件 —– Gson Format, 通過Json格式快速生成Java Bean類,提高開發(fā)效率
其實(shí)有很多很好用的插件可供選擇,不僅可以提高效率,還可以增加自己對開發(fā)的興趣,可以去多了解一下。
謝謝。
轉(zhuǎn)載于:https://www.cnblogs.com/lanzhi/p/6467206.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的Android 应用 之路 天气预报(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。