CH12-综合项目—仿美团外卖:从零到一构建Android订餐应用

📅 2026/7/15 4:47:47
CH12-综合项目—仿美团外卖:从零到一构建Android订餐应用
1. 项目概述与开发环境搭建这个仿美团外卖项目是一个完整的Android实战案例适合想要学习商业级应用开发的初学者。项目从零开始构建一个功能完善的外卖订餐应用涵盖店铺列表、购物车、订单支付等核心模块。我当年第一次做这类项目时踩过不少坑现在把经验都总结给你。1.1 开发工具准备你需要准备以下工具和环境Android Studio建议使用最新稳定版目前是2023.3.1我在项目中使用的是Arctic Fox版本JDK至少JDK 11以上注意配置好JAVA_HOME环境变量Tomcat8.5.x版本作为本地服务器模拟器推荐使用第三方模拟器如夜神模拟器原生模拟器访问本地服务器可能会有问题注意Tomcat配置时记得修改server.xml中的连接器端口避免与现有服务冲突。我遇到过8080端口被占用的坑后来改用8090端口就顺利多了。1.2 项目结构设计先来看整体架构设计app/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── adapter/ # 各种适配器 │ │ │ ├── bean/ # 数据实体类 │ │ │ ├── fragment/ # 碎片组件 │ │ │ ├── activity/ # 四大核心页面 │ │ │ └── utils/ # 工具类 │ │ └── res/ # 资源文件 ├── build.gradle # 模块级配置 └── libs/ # 第三方库关键依赖库在build.gradle中的配置示例dependencies { implementation com.squareup.okhttp3:okhttp:4.9.3 // 网络请求 implementation com.google.code.gson:gson:2.8.9 // JSON解析 implementation com.github.bumptech.glide:glide:4.12.0 // 图片加载 }2. 核心功能实现2.1 店铺列表模块店铺列表是用户看到的第一个界面采用RecyclerViewCardView实现瀑布流布局。我优化过的关键点数据获取// 使用OkHttp异步获取数据 OkHttpClient client new OkHttpClient(); Request request new Request.Builder() .url(Constant.WEB_SITE Constant.REQUEST_SHOP_URL) .build(); client.newCall(request).enqueue(new Callback() { Override public void onResponse(Call call, Response response) { // 处理JSON数据 String json response.body().string(); ListShopBean shops JsonParse.getInstance().getShopList(json); runOnUiThread(() - { adapter.setData(shops); }); } });性能优化技巧使用Glide加载图片时添加占位图实现ViewHolder模式避免重复findViewById对价格显示使用BigDecimal避免精度问题2.2 购物车功能购物车实现有几个技术难点需要注意数据结构设计public class FoodBean implements Serializable { private int foodId; private String foodName; private BigDecimal price; // 使用BigDecimal处理金额 private int count; // 商品数量 // 省略getter/setter }实时计算总价public BigDecimal calculateTotal() { BigDecimal total BigDecimal.ZERO; for (FoodBean item : cartItems) { total total.add(item.getPrice().multiply( BigDecimal.valueOf(item.getCount()))); } return total; }踩坑提醒早期我用double计算金额出现了精度问题后来改用BigDecimal才解决。建议金融相关计算都用BigDecimal。3. 订单支付流程3.1 订单页面布局订单页面采用ConstraintLayout实现复杂布局关键部分androidx.constraintlayout.widget.ConstraintLayout !-- 收货地址 -- TextView android:idid/tv_address/ !-- 商品列表 -- RecyclerView android:idid/rv_order app:layout_constraintTop_toBottomOfid/tv_address/ !-- 支付按钮 -- Button android:idid/btn_pay app:layout_constraintBottom_toBottomOfparent/ /androidx.constraintlayout.widget.ConstraintLayout3.2 支付功能实现支付模块集成微信/支付宝SDK时要注意签名验证public boolean verifySign(String sign, String data) { try { Signature signature Signature.getInstance(SHA256withRSA); signature.initVerify(getPublicKey()); signature.update(data.getBytes()); return signature.verify(Base64.decode(sign, Base64.DEFAULT)); } catch (Exception e) { Log.e(Payment, 验签失败, e); return false; } }支付状态回调Override public void onPayResult(int code, String message) { switch (code) { case 0: // 成功 showToast(支付成功); break; case -1: // 失败 showToast(支付失败 message); break; case -2: // 取消 showToast(已取消支付); break; } }4. 服务器交互与数据解析4.1 Tomcat服务器配置本地开发时Tomcat的配置要点将shop_list_data.json放在webapps/order目录下修改JSON文件中的图片路径为本地绝对路径启动Tomcat后通过http://localhost:8080/order/访问4.2 JSON数据解析使用Gson解析服务器返回的数据public ListShopBean parseShopList(String json) { Type type new TypeTokenListShopBean(){}.getType(); return new Gson().fromJson(json, type); }网络请求超时处理方案OkHttpClient client new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .writeTimeout(15, TimeUnit.SECONDS) .build();5. 项目优化与扩展5.1 性能优化建议内存优化使用LeakCanary检测内存泄漏大图加载使用Glide的override()方法限制尺寸及时回收不再使用的Bitmap启动优化// 在Application中预加载常用数据 public class MyApp extends Application { Override public void onCreate() { super.onCreate(); new Thread(() - { // 预加载数据 }).start(); } }5.2 功能扩展方向增加用户登录系统实现收藏店铺功能添加商品搜索功能集成地图选择收货地址这个项目我前后迭代了3个版本最初版只用了2周就完成了基础功能。建议你先跑通主流程再逐步添加扩展功能。实际开发中处理好异步请求的回调和数据同步是关键特别是购物车和订单状态的同步更新。