第一行代码---天气预报App

    天气预报已经完成了,作为一个刚刚学Android没多久的小白,就写一个博客记录一下开发的一路历程吧。🤓🤓

    在开始之前,首先得确定要实现的功能,这里我选择实现和书上一样的功能:搜索城市信息,查看天气信息,切换城市和手动刷新天气这四个功能。

     然后 要如何才能得到全球大多数国家的城市数据,以及如何才能获取每个城市的天气信息呢?因为现在网上免费的天气预报接口越来越少,所以这里选择了功能强大且长期稳定的服务器接口——彩云天气。链接地址为:https://dashboard.caiyunapp.com/,就可以注册啦。然后在应用管理申请一个应用,d1766e3efdf546cebde4cb9090444387.png

 填入相应信息即可。当然可以把代码托管到github上,地址为:https://github.com/,没有账号可以注册一个呦。接下来在主页上创建一个版本库,勾选“initialize this repository with a README”,并添加一个Android项目的.gitignore文件,和使用ApacheLicense2.0作为项目的开源协议,然后就创建好了一个版本库啦。

ebb1b7ee6d924dc997fcb13cc65d2d21.png托管步骤的最后就是打开git切换到项目目录下,再把版本库克隆到本地,然后再把提交的内容同步到版本库就托管好了。

   准备工作就到这里了,然后正式进入项目了。首先接着搭建架构,这里选择的是MVVM架构,该架构主要分为三部分:数据模型部分,界面展示部分,还有相当于两者桥梁的ViewModel部分,关于这个架构就不赘述啦。

然后就可以根据架构开始搭建项目结构,首先呢,在com.example.myapplication包下新建了logic包和ui包,其中logic包中有dao,model,network三个包分别用于存放数据访问对象,对象的模型以及网络相关的代码,而ui包又有place包和weather两个包,分别对应两个界面。然后添加依赖库了,注意!!!注意!!!这里是一个坑,因为添加不同版本的依赖库和依赖库的多添加和少添加都会造成报错,以及某种不兼容的报错,我在写的时候这些类似问题的报错,最后也是试验了多次以及查询了很多资料才解决了,下图为我个人项目添加的依赖库,仅仅代表个人项目,借鉴的时候要注意一下喔。

9e7285be4b42497abb5a9a8844232b6f.png

 接下来看第一个功能:搜索城市。因为我们使用的是MVVM架构,所以从viewmodel层开始就没有activity引用了,所以可以新建一个类实现让项目可以全局获取context的方式,当然可以把在彩云天气申请到的令牌值放进去。

cc81cd252c4146c79bfa03ec249c8a3d.png

 接着完成数据类的建立,在logic包的model新建一个文件,并根据在彩云平台api返回的数据格式定义数据类。

c4ca50859c174842b436d34e973f8b53.png

 然后完成网络层的代码,首先在newwork包下定义一个访问彩云平台城市搜索api的接口,因为城市搜索API的query参数是要动态指定的 ,所以要加上@Query注解哦,接着再新建一个类实现网络请求,这里选择的是Retrofit网络库来完成请求和回调。在代码中首先获得一个Retrofit对象,然后创建一个动态代理对象。最后再新建一个类定义统一的网络数据源的访问入口。

cf3b0b5ce0cd49979dd1072aad99b778.png

4cccb3807cf740e1b5c20b664ce0d0f0.png 

564f08b431de4880ac7635d4f371a9cd.png 

 因为这种城市搜索的请求没有太多的缓存必要,所以直接请求最新的数据就可以了,那么在logic包下新建一个类作为仓库层的统一封装入口。这里调用了网络层的代码发起城市搜索请求,如果服务器响应为OK,那么就用success方法包装获取的城市数据,反之包装一个异常。

0c259ae1f90447e4a612f13a22d11543.png

 然后在ui包/place包下,新建一个viewmodel层的类,它把传入的参数赋值给一个searchlivedata对象,并且用switchmap方法进行观察。

55d3d40870364415b74cf31dedfb4409.png

 接着到ui层了,这里就不多说了,直接上代码。首先新建一个布局为用户提供搜索和搜索结果展示。

ea0b07dd20784b02a2a4e885b239f8ed.png

 然后新建一个布局给RecyclerView控件提供子项布局。

ec43285c725b47aba0048d059769c115.png

接着把fragment添加到activity中,完成UI。

ff85c9df908f4ef9b690aa779025615a.png

 

 当然,使用了RecyclerView控件就要准备一个适配器了,在ui/place包下,新建一个类实现适配器代码。

2a4d8e8166b64aa5b32ae78e309a9335.png

 最后,就剩下对Fragment进行实现了,在ui/place包下新建一个类,继承于Fragment。然后使用了lazy函数这种懒加载技术来获取PlaceVievModet的实例,接着再来看anActivityCreated()方法,这个方法中先是给RecyclerView设置了LayoutManager和适配器,并使用PlaceViewModel中的placelist 集合作为数据源。紧接着调用了EditText的ddTextChangedListener()方法来监听搜索框内容的变化情况。每当搜索框中的内容发生了变化,我们就获取新的内容,然后传递给PlaceViewModel的searchPlaces()方法,这样就可以发起搜索城市数据的网络请求了。而当输入搜索框中的内容为空时,我们就将RecycTerView隐藏起来,同时将那张仅用于美观用途的背景图显示出来。最后借助LiveData完成获取服务器响应的数据。

ce211c4a2832456a904d2398192c8e7e.png

4523dfab482f4c00b4588ea2426ce300.png 

 

别忘了在AndroidMainfest.xml中添加网络权限喔。做到这里已经完成了天气预报的第一个功能:城市搜索。至于其他的功能和代码我会尽快更新的。

 

 

 

 

 

 

 

  

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
抱歉,我作为一个语言模型,无法提供完整的代码。但是,以下是一个简单的天气预报应用程序的代码示例,使用了第三方API OpenWeatherMap: ```java public class WeatherActivity extends AppCompatActivity { private TextView tvTemperature, tvCity, tvDescription; private ImageView ivIcon; private String API_KEY = "your_api_key"; private String API_URL = "http://api.openweathermap.org/data/2.5/weather?q=%s&units=metric&APPID=%s"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weather); tvTemperature = findViewById(R.id.tv_temperature); tvCity = findViewById(R.id.tv_city); tvDescription = findViewById(R.id.tv_description); ivIcon = findViewById(R.id.iv_icon); String cityName = getIntent().getStringExtra("city_name"); String url = String.format(API_URL, cityName, API_KEY); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { JSONObject main = response.getJSONObject("main"); JSONArray weatherArray = response.getJSONArray("weather"); JSONObject weather = weatherArray.getJSONObject(0); double temperature = main.getDouble("temp"); String description = weather.getString("description"); String icon = weather.getString("icon"); tvTemperature.setText(String.format("%.0f°C", temperature)); tvDescription.setText(description); tvCity.setText(cityName); Glide.with(WeatherActivity.this) .load("http://openweathermap.org/img/w/" + icon + ".png") .into(ivIcon); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(WeatherActivity.this, "Error: " + error, Toast.LENGTH_LONG).show(); } }); Volley.newRequestQueue(this).add(jsonObjectRequest); } } ``` 需要注意的是,这个示例应用程序使用了第三方库 Glide 和 Volley。在您的项目中使用前,请确保已将其添加到您的项目中。此外,您需要在 OpenWeatherMap 网站上注册并获取 API 密钥,然后将其替换为上面代码中的 `your_api_key`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值