简介这份资源是面向Android初学者与移动开发入门者的天气预报小程序完整源码基于Android Studio开发环境帮助读者理解从项目搭建到网络请求、数据解析与界面绑定的完整流程。压缩包共1260个文件约9.76MB包含33个java源码文件、76个xml布局与配置、120个json数据文件、192个class与194个dex编译产物以及gradle构建脚本、properties配置、png图标资源和apk安装包等覆盖源码、构建产物与运行包三类内容。已有3876人学习下载适合对照源码梳理Retrofit网络请求、Gson解析、异步回调与UI数据绑定等关键环节。读者可从中获得可直接运行的工程结构、接口定义与响应模型示例、布局与控件绑定写法以及错误处理、下拉刷新、数据缓存和天气图标加载等优化思路便于在此基础上扩展多城市切换与多日预报功能。1. 从一份能跑起来的 Android 天气预报源码说起很多人第一次接触 Android 网络请求都是从「写个天气预报」开始的。这份 AndroidStudio 实现天气预报小程序源码核心就是一套完整的「界面 网络请求 JSON 解析 数据展示」闭环麻雀虽小五脏俱全。它解决的不是「预报准不准」的问题而是让你把 OkHttp 发请求、Gson 解析、RecyclerView 或 ListView 渲染这条链路真正跑通一遍。适合两类人一是刚学完四大组件、想找个能跑的项目练手的在校生二是需要快速搭一个天气模块 Demo 的开发者。源码里通常包含布局文件、Activity 逻辑、网络工具类、实体类以及一个可替换的天气接口地址。拿到手第一件事不是改代码而是先让它在你机器上跑起来再谈二次开发。2. 环境搭建与工程导入把源码跑起来才算数2.1 版本匹配是导入成功的前提AndroidStudio 项目导入失败十有八九是 Gradle 版本和 AGP 版本对不上。这份源码如果年代稍早用的可能是 Gradle 6.x 或 7.x而你本地装的是最新版 AndroidStudio默认拉的是 8.x 的 AGP一导入就报Unsupported class file major version或者Could not find method implementation()。常见做法是打开项目根目录的build.gradle先看com.android.tools.build:gradle的版本号再对照gradle/wrapper/gradle-wrapper.properties里的distributionUrl把本地 Gradle 换成匹配的版本。具体操作分三步。第一步别急着用 AndroidStudio 的「Open」先看gradle-wrapper.properties# 打开 gradle/wrapper/gradle-wrapper.properties # 关注这一行它决定用哪个 Gradle distributionUrlhttps\://services.gradle.org/distributions/gradle-7.5-bin.zip这个7.5就是 Gradle 版本。第二步去项目根build.gradle看 AGP// 根目录 build.gradle buildscript { dependencies { // 这个版本必须和 Gradle 版本兼容 classpath com.android.tools.build:gradle:7.2.2 } }Gradle 7.5 对应 AGP 7.2 到 7.4 是安全的。第三步如果本地没有对应 GradleAndroidStudio 会按distributionUrl自动下载但国内网络经常卡住可以在设置里勾选「Use Gradle from: specified location」指向本地已解压的 Gradle 目录。参数上compileSdkVersion和targetSdkVersion建议统一改成 33 或 34minSdkVersion保持源码原值即可改高了会丢设备兼容性。提示导入前先备份一份原始源码改崩了能回退这是血泪经验。2.2 依赖下载与离线缓存处理依赖拉不下来是第二个高频翻车点。源码里一般会引 OkHttp、Gson、Glide 或 Picasso 这类库如果build.gradle里写的是implementation com.squareup.okhttp3:okhttp:4.9.0而你的仓库配置只有google()和mavenCentral()国内直连经常超时。常见做法是在根build.gradle的repositories里加上阿里云的镜像仓库顺序放在最前面// 根目录 build.gradle 的 allprojects.repositories repositories { // 镜像放前面优先命中 maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/google } google() mavenCentral() }加完后点「Sync Now」。如果还是失败看 AndroidStudio 底部 Build 窗口的具体报错是Could not resolve还是Connection timed out。前者是坐标写错或仓库没有后者是网络问题。参数上OkHttp 4.x 需要 Java 8如果源码用的是 3.x注意OkHttpClient的 API 差异比如RequestBody.create()在 4.x 里参数顺序变了。这一步做完工程能编译通过才算真正「导入成功」。3. 网络请求与 JSON 解析天气数据的完整链路3.1 接口选型与请求参数构造天气预报源码的数据来源通常是一个 HTTP 接口返回 JSON。常见的有和风天气、心知天气、OpenWeatherMap也有用腾讯天气 API 的。源码里一般会把接口地址和 key 写在Constants或ApiConfig类里。你要做的是先确认这个接口还能不能用——很多老源码里的免费接口早就下线了请求返回 403 或空数据。常见做法是先用浏览器或 Postman 访问一次接口地址看返回结构。以和风天气为例请求 URL 形如# 先手动验证接口是否存活 # key 换成你自己申请的location 是城市 ID https://devapi.qweather.com/v7/weather/now?location101010100key你的KEY返回的 JSON 里now对象包含temp、text、humidity等字段。源码里的请求代码一般长这样// 用 OkHttp 发 GET 请求 OkHttpClient client new OkHttpClient(); Request request new Request.Builder() .url(https://devapi.qweather.com/v7/weather/now?location101010100key KEY) .get() .build(); client.newCall(request).enqueue(new Callback() { Override public void onFailure(Call call, IOException e) { // 网络失败切回主线程更新 UI } Override public void onResponse(Call call, Response response) throws IOException { // 拿到 response.body().string() 后交给 Gson } });逻辑说明enqueue是异步请求回调在子线程更新 UI 必须runOnUiThread。参数上location是城市编码不是中文城市名写「北京」会返回错误码。key是申请来的有调用次数限制别硬编码在公开仓库里。如果源码用的是HttpURLConnection逻辑类似但要注意手动开子线程否则 Android 4.0 以后直接抛NetworkOnMainThreadException。3.2 Gson 实体类映射与字段对齐JSON 解析翻车最多的地方是字段名对不上。源码里的实体类可能叫WeatherBean字段是temperature而接口返回的是tempGson 默认按字段名匹配对不上就是 null。解决办法是用SerializedName注解public class WeatherNow { // 接口返回 temp这里映射到 temperature SerializedName(temp) private String temperature; SerializedName(text) private String weatherText; SerializedName(humidity) private String humidity; // 省略 getter/setter }解析时Gson gson new Gson(); // responseStr 是接口返回的原始字符串 WeatherResponse resp gson.fromJson(responseStr, WeatherResponse.class); // 注意判空接口异常时 resp 可能为 null if (resp ! null resp.getNow() ! null) { String temp resp.getNow().getTemperature(); }参数说明fromJson第二个参数是目标类型嵌套结构要一层层建实体类。如果接口返回的code字段是字符串200而实体类写成intGson 会尝试转换转不了就抛JsonSyntaxException。建议先用JsonReader或在线工具把 JSON 结构看清楚再决定字段类型。这一步做完数据能从接口流到内存对象下一步才是渲染。4. 界面渲染与交互把数据摆到该在的位置4.1 布局文件与列表适配器天气界面一般分两块当前天气大卡片加未来几天列表。当前天气用LinearLayout或ConstraintLayout摆几个TextView显示温度、天气、湿度。未来几天用RecyclerView适配器里绑定每天的数据。源码里如果用的是ListView注意ViewHolder模式要自己写不然滑动卡顿。RecyclerView 适配器核心代码// 在 onBindViewHolder 里绑定数据 Override public void onBindViewHolder(ViewHolder holder, int position) { DailyBean bean list.get(position); // 日期、天气、温度分别设置 holder.tvDate.setText(bean.getDate()); holder.tvText.setText(bean.getText()); // 温度拼接注意 null 判断 holder.tvTemp.setText(bean.getTempMax() ° / bean.getTempMin() °); }逻辑说明onBindViewHolder每次滑动都会调用别在里面做耗时操作。参数上position对应数据源下标list为空时getItemCount返回 0不会崩。如果源码里getItemCount写死返回一个固定值数据不满就会显示空白项改成return list null ? 0 : list.size()。4.2 主线程更新与生命周期处理网络回调在子线程直接setText会抛CalledFromWrongThreadException。常见做法是runOnUiThread包一层runOnUiThread(new Runnable() { Override public void run() { // 这里更新 UI 才安全 tvTemp.setText(temp); } });另一个坑是 Activity 销毁后回调才回来runOnUiThread里访问已销毁的 View轻则无效果重则内存泄漏。稳妥做法是在onDestroy里取消请求OkHttp 的Call对象调cancel()。参数上如果源码用了AsyncTask注意 Android 11 以后AsyncTask已废弃能跑但不推荐新项目换ExecutorService或协程。这一步做完界面能正确显示数据交互闭环才算完成。5. 避坑与常见问题排查5.1 导入报错Unsupported class file major version现象一打开工程就红Build 窗口提示 class 文件版本不支持。原因AndroidStudio 自带的 JDK 版本和源码编译用的 JDK 版本不一致比如源码用 JDK 8 编译你本地是 JDK 17。解决在File Project Structure SDK Location里把 Gradle JDK 改成 11 或 8和源码匹配。5.2 接口返回 403 或数据为空现象App 能跑但天气数据全是空或显示「获取失败」。原因源码里的接口 key 过期、接口下线或者请求头缺User-Agent。解决先用浏览器验证接口换一个可用的天气 API把 URL 和 key 替换掉同时检查OkHttp请求有没有加必要 header。5.3 中文乱码现象城市名或天气描述显示成问号或方块。原因接口返回的编码不是 UTF-8或者response.body().string()读取时没指定字符集。解决在Response里取body().bytes()再用new String(bytes, UTF-8)或者确认接口本身返回 UTF-8。5.4 模拟器无网络现象真机能请求模拟器一直超时。原因模拟器 DNS 或网络配置问题或者源码里用了localhost而不是10.0.2.2。解决模拟器访问宿主机用10.0.2.2访问外网检查模拟器设置里的 DNS改成8.8.8.8试试。5.5 打包 release 后崩溃现象debug 正常release 一打开就闪退。原因代码混淆把 Gson 实体类的字段名改了反序列化对不上。解决在proguard-rules.pro里加-keep class 你的包名.bean.** { *; }保留实体类。6. 进阶改造换接口、加定位、做缓存源码跑通之后真正有价值的是按自己需求改造。第一个方向是换接口。把ApiConfig里的 URL 和 key 换成你自己申请的注意不同接口返回结构不同实体类要跟着改。第二个方向是加定位。用LocationManager或高德 SDK 拿到经纬度再调接口的location经度,纬度参数就能实现「自动定位当前城市」。第三个方向是做缓存。天气数据没必要每次打开都请求用SharedPreferences存一份 JSON 和时间戳半小时内直接读缓存// 读缓存示例 SharedPreferences sp getSharedPreferences(weather, MODE_PRIVATE); long lastTime sp.getLong(time, 0); // 半小时有效期 if (System.currentTimeMillis() - lastTime 30 * 60 * 1000) { String cache sp.getString(data, ); // 直接用 cache 解析 }参数上缓存时间按业务定天气类 30 分钟到 1 小时都合理。验证改造是否成功别只看界面用 AndroidStudio 的 Logcat 过滤OkHttp或你自己打的 TAG确认请求发出、响应回来、解析没抛异常。我一般改完接口后会先断网跑一次看缓存逻辑是否生效再联网跑一次看数据是否刷新。从那以后我每次拿到新源码都强制先跑通原始版本再动一行代码这个习惯帮我省了无数排查时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?