Android Studio 3.2 + Tomcat 8.5.59 本地服务器联调:仿美团外卖项目数据请求3步配置
·
Android Studio与Tomcat本地服务器联调实战:从零搭建仿美团外卖数据交互系统
1. 开发环境全景配置指南
在开始仿美团外卖项目前,需要搭建完整的Android客户端与本地服务器联调环境。不同于简单的UI开发,网络数据交互类项目对环境配置有更严格的要求。
必备工具清单:
- Android Studio 3.2+ :推荐使用稳定版而非最新版,避免兼容性问题
- JDK 8 :注意配置JAVA_HOME环境变量
- Tomcat 8.5.59 :经测试最稳定的教学用版本
- 第三方模拟器 :夜神/天天模拟器(原生模拟器无法访问本地网络)
关键提示:Android原生模拟器默认使用独立网络空间,无法直接访问主机localhost。必须使用桥接模式的第三方模拟器或真机调试。
环境验证步骤:
- 启动Tomcat服务
# Windows环境
cd apache-tomcat-8.5.59/bin
startup.bat
# 验证访问
curl http://localhost:8080
- 配置模拟器网络
# 获取主机IP(非127.0.0.1)
ipconfig /all
# 模拟器需使用该IP访问服务
2. Tomcat服务端深度配置
2.1 项目目录结构规范
webapps/
└── ROOT/
├── shop_list_data.json # 店铺数据
├── order/ # 订单相关API
│ └── submit.json
└── img/ # 图片资源
├── shop/
└── food/
2.2 关键配置项说明
server.xml连接器优化:
<Connector
port="8080"
connectionTimeout="20000"
maxThreads="150"
URIEncoding="UTF-8"/>
跨域支持配置(web.xml):
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.3 数据文件示例(shop_list_data.json)
[
{
"id": 1001,
"shopName": "川湘居",
"saleNum": 2356,
"offerPrice": 20,
"distributionCost": 5,
"feature": "川菜",
"time": "30分钟",
"banner": "img/shop/1001_banner.jpg",
"shopPic": "img/shop/1001_icon.jpg",
"foodList": [
{
"foodId": 2001,
"foodName": "水煮鱼",
"price": 68,
"foodPic": "img/food/2001.jpg"
}
]
}
]
3. Android客户端网络架构实现
3.1 网络权限与基础配置
AndroidManifest.xml必备权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
网络请求白名单配置(Android 9+):
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.1.100</domain>
</domain-config>
</network-security-config>
3.2 网络请求核心代码
OkHttpClient单例封装:
public class HttpUtil {
private static final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
public static void get(String url, Callback callback) {
Request request = new Request.Builder()
.url(Constant.WEB_SITE + url)
.build();
client.newCall(request).enqueue(callback);
}
}
数据解析工具类:
public class JsonParse {
public static List<ShopBean> parseShopList(String json) {
Type type = new TypeToken<List<ShopBean>>(){}.getType();
return new Gson().fromJson(json, type);
}
}
4. 关键问题解决方案
4.1 第三方模拟器网络配置
夜神模拟器特殊设置:
- 进入设置 -> WLAN
- 长按当前网络 -> 修改网络
- 勾选"显示高级选项"
- 代理选择"手动"
- 主机名填写电脑IP,端口填写8888(Charles抓包端口)
连接测试命令:
adb shell ping 192.168.1.100
4.2 数据缓存策略优化
两级缓存实现方案:
- 内存缓存:使用LruCache
private LruCache<String, Bitmap> memoryCache = new LruCache<>(maxMemory / 8);
- 磁盘缓存:使用DiskLruCache
DiskLruCache diskCache = DiskLruCache.open(
cacheDir,
1, // appVersion
1, // valueCount
10 * 1024 * 1024 // maxSize
);
4.3 接口安全增强措施
基础签名验证:
public static String generateSign(Map<String, String> params, String secret) {
params.put("timestamp", System.currentTimeMillis() + "");
params.put("nonce", UUID.randomUUID().toString());
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
StringBuilder sb = new StringBuilder();
for (String key : keys) {
sb.append(key).append("=").append(params.get(key)).append("&");
}
sb.append("secret=").append(secret);
return MD5(sb.toString());
}
5. 调试技巧与性能优化
5.1 网络请求监控方案
Charles抓包配置步骤:
- 安装Charles证书到模拟器
- 配置Proxy -> SSL Proxying Settings
- 添加Location:Host为
*,Port为443 - Android代码配置代理:
client.setProxy(new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("192.168.1.100", 8888)));
5.2 内存泄漏检测
LeakCanary集成:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
关键检测点:
- Activity/Fragment中的Handler
- 单例模式中的Context引用
- 静态集合对象
5.3 网络图片加载优化
Glide高级配置:
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.override(Target.SIZE_ORIGINAL)
.signature(new ObjectKey(version))
.into(imageView);
6. 项目进阶方向
6.1 服务端改造建议
Spring Boot替代方案优势:
- 内置Tomcat无需单独配置
- 简化RESTful API开发
- 更好的热部署支持
基础Controller示例:
@RestController
@RequestMapping("/shop")
public class ShopController {
@GetMapping("/list")
public List<Shop> getShopList() {
return shopService.getAllShops();
}
}
6.2 客户端架构升级
MVVM改造步骤:
- 引入ViewModel和LiveData
- 数据绑定替代findViewById
- Repository模式管理数据源
ViewModel示例:
public class ShopViewModel extends ViewModel {
private MutableLiveData<List<Shop>> shops = new MutableLiveData<>();
public void loadShops() {
// 网络请求逻辑
}
public LiveData<List<Shop>> getShops() {
return shops;
}
}
7. 避坑指南
常见问题排查表:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 网络请求超时 | 防火墙拦截/IP错误 | 关闭防火墙/检查IP配置 |
| JSON解析失败 | 数据格式不符/字段缺失 | 使用Gson的@SerializedName注解 |
| 图片加载失败 | URL编码问题/缓存失效 | URLEncode处理/清除缓存 |
| 模拟器无法联网 | 代理配置错误 | 重置为NAT模式 |
性能优化检查清单:
- [ ] 网络请求合并与减少
- [ ] 图片加载使用合适尺寸
- [ ] 避免主线程耗时操作
- [ ] 使用RecyclerView替代ListView
- [ ] 合理配置线程池
更多推荐




所有评论(0)