酷欧天气bug

源码地址

本文出自EzraZhao,转载请注明出处。

本篇文章只适合刚入门菜鸟,大神级请绕道,谢谢。

废话不多说,相信大家有不少人都在学习或者学过郭霖郭大神的第一行代码,本人在学习第二版时,在制作酷欧天气中发现一个小bug,不知道大家有没有发现。

在你启动郭神的应用后,现在假如已经加载了一个城市的天气信息,然后你进行切换城市操作,然后进行刷新操作,哎,你会发现城市竟然又切回了启动时的城市天气,而且不管你切换几次,只要一刷新,就会切回原来的。

这个小bug在我做完随意切换城市时发现的。然后进行一番调试,发现问题的根源在于WeatherActivity的onCreate()方法

final String weatherId;

if (weatherString != null) {
            //有缓存时直接解析天气数据
            Weather weather = Utility.handleWeatherResponse(weatherString);
            weatherId = weather.basic.weatherId;
            showWeatherInfo(weather);
        } else {
            //无缓存时去服务器查询天气
            weatherId = getIntent().getStringExtra("weather_id");
            //请求数据时先将ScrollView隐藏,否则空界面看上去会比较奇怪
            weatherLayout.setVisibility(View.INVISIBLE);
            requestWeather(weatherId);
        }

不知道你发现问题没,如果没有发现,好,让我们一起来回想一下Activity的生命周期,还记得onCreate()方法只会在Activity创建时执行一次吗?明白没,对了,就是这个问题,咱们的weatherId只会在WeatherActivity创建时被加载一次,也就是说当你启动应用后,咱们的应用会默认加载一次天气,如果你是第一次安装,那么就会从服务器加载,没问题,如果你是已经打开过,会从缓存加载,没问题。然后你切换一次城市,哎,问题来了,由于咱们的WeatherActivity创建完了,然后weatherId就不会再更改了,所以咱们的

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                requestWeather(weatherId);
            }
        });

这个方法每次传入的id都是在Activity创建时的同一个,一刷新当然会改回去咯。

然而这个小bug怎么解决呢?so easy,weatherId不是不变么,来,咱们来解决一下:

先提供一种简单的方案:
哦,requestWeather(String weatherId)这个这个里面的id每次都是新的,那咱们就把weatherId从onCreate()方法中拿出去,变成全局变量,然后在requestWeather(String weatherId)这个方法中更新一下,

public void requestWeather(String weatherId) {
        String weatherUrl = "http://guolin.tech/api/weather?cityid="
                + weatherId + "&key=" + API_KEY;
        //使weatherId成为全局变量,在每一次请求时都更新当前id
        this.weatherId = weatherId;
        ...
}

就是这么简单,每次更新一下,解决!

咱们再来看一种不把weatherId变成全局变量的方法:

这个方法借助SharedPreferences将weatherId在选择城市后进行本地存储一下,来,我们改一下ChooseAreaFragment这个类中的代码:

public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (currentLevel == LEVEL_PROVINCE) {
                    selectedProvince = provinceList.get(position);
                    queryCities();
                } else if (currentLevel == LEVEL_CITY) {
                    selectedCity = cityList.get(position);
                    queryCounties();
                } else if (currentLevel == LEVEL_COUNTY) {
                    String weatherId = countyList.get(position).getWeatherId();
                    if (getActivity() instanceof MainActivity) {
                        Intent intent = new Intent(getActivity(), WeatherActivity.class);
                        intent.putExtra("weather_id", weatherId);
                        startActivity(intent);
                        getActivity().finish();
                    } else if (getActivity() instanceof WeatherActivity) {
                        WeatherActivity activity = (WeatherActivity) getActivity();
                        
                        //对,改的就是这!
                        SharedPreferences.Editor editor =
                                    PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this)
                                            .edit();
                            editor.putString("weather_id", weatherId);
                            editor.apply();
                            
                        activity.drawerLayout.closeDrawers();
                        activity.swipeRefresh.setRefreshing(true);
                        activity.requestWeather(weatherId);
                    }
                }
            }
        });

然而这样完了吗?当然并没有,我们只是存储了,在WeatherActivity中还是只读取了一次啊,下面我们再来改一下刷新时监听器代码:

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                SharedPreferences prefs = PreferenceManager
                        .getDefaultSharedPreferences(WeatherActivity.this);
                String temp = prefs.getString("weather_id", weatherId);
                requestWeather(temp);
            }
        });

是不是也是so easy,
我们跑一下吧~
(@ο@) 哇哈哈哈~改完bug就是爽!

欢迎交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,020评论 25 707
  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 5,729评论 2 51
  • 哎呀呀 ,马上就要面临找工作了,媛媛心里紧张呀. 作为一个即将毕业的Android程序媛,开始面临找工作了,...
    左神话阅读 4,550评论 7 59
  • 今天本来计划早早睡下,明天元气满满的上班.可是正在计划睡觉的时候,离我2米远的工作号手机铃声传来,不用想我都知道是...
    天然美阅读 891评论 0 0
  • 每天都要到很晚才愿意入睡,熬到极点才让自己身心俱疲地闭上眼。物理层面的消耗,自虐不过如此。其实,是开学焦虑。 想想...
    _莫闲阅读 167评论 0 0