日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 应用 之路 天气预报(五)

發(fā)布時間:2024/4/17 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 应用 之路 天气预报(五) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

寫了上一篇文章,講了下這個實(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() {// TODO Auto-generated method stubsuper.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() {// TODO Auto-generated method stubsuper.onCreate();JuheSDKInitializer.initialize(getApplicationContext());//初始化Juhe數(shù)據(jù)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;//所有城市Listprivate ArrayList<CityItem> mSearchCityList;//城市查詢結(jié)果Listprivate CityAdapter mCityAdapter;//城市GridView的Adapter@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>();//設(shè)置帶shape模式的編輯框的背景顏色//GradientDrawable myGrad = (GradientDrawable)mSearchEditView.getBackground();//myGrad.setColor(getResources().getColor(R.color.choosecitysearchbackground));//給城市名編譯框添加文本變化的觀察者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();//城市查詢結(jié)果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();}@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 {//解析JSON數(shù)據(jù)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);//查詢結(jié)果添加mCityAdapter.notifyDataSetChanged();//notify數(shù)據(jù)變化}} 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);//避免onBackPress的時候編輯框中還有數(shù)據(jù)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");//從選擇城市界面選擇城市傳遞到這個ActivitymFutureList = new ArrayList<WeatherInfo.ResultBean.FutureBean>();//未來7天預(yù)報(bào)的ListmFutureAdapter = new FutureAdapter(this, mFutureList);//未來天氣預(yù)報(bào)的GridView的AdaptergvFuture.setAdapter(mFutureAdapter);}@Overrideprotected void onResume() {super.onResume();mFutureList.clear();getWeatherInfoByCity(this, mCityName);//查詢天氣信息,包含的內(nèi)容比較多,速度還算快,沒有單獨(dú)使用線程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() {// TODO Auto-generated method stub//Toast.makeText(getApplicationContext(), "finish", Toast.LENGTH_SHORT).show();}@Overridepublic void onFailure(int statusCode, String responseString, Throwable throwable) {// TODO Auto-generated method stubLog.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)容還不錯,歡迎將生活随笔推薦給好友。