工具/方法 | 适用场景 | 使用说明 |
---|---|---|
Logcat | 日志输出 | Log.d("Tag", "message") ,通过过滤Tag或关键词查看日志 |
Stetho | 网络请求与数据库调试 | 集成Stetho库,浏览器访问chrome://inspect 实时查看数据 |
Android Studio调试器 | 断点调试 | 在关键代码行设置断点,观察变量值与执行流程 |
SQLite Browser | SQLite数据库文件查看 | 通过adb 拉取.db 文件,用工具直接查询数据 |
Network Interceptor | 网络请求拦截 | OkHttp或Retrofit添加拦截器,打印请求/响应体(需注意隐私数据) |
SharedPreferences
Editor
强制提交后读取,或直接清除文件检查默认值 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); String value = sp.getString("key", "default"); Log.d("SP_DEBUG", "Value: " + value);
SQLite/Room数据库
sqlite3
命令行工具:adb shell "sqlite3 /data/data/包名/databases/db名"
Stetho
或DB Browser
可视化工具直接查询 insert
返回的long
值是否为-1
SELECT FROM table
文件存储
adb pull
命令将文件拉到本地: adb pull /storage/emulated/0/Download/test.txt ./ # 拉取到当前目录
OPEN_READ
/OPEN_WRITE
) 工具/方法 | 适用场景 | 关键代码示例 |
---|---|---|
OkHttp拦截器 | Retrofit/OkHttp网络库 | 添加HttpLoggingInterceptor 并设置Level.BODY |
Charles/Fiddler | 抓包分析 | 配置手机代理,信任证书后捕获HTTP/HTTPS请求 |
模拟网络环境 | 测试不同网络状态 | 使用NetworkInterceptor 模拟延迟、断网等场景(需配合TestRule) |
OkHttp拦截器示例:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(chain -> { Log.d("OKHTTP", "Request: " + chain.request().url()); Response response = chain.proceed(chain.request()); Log.d("OKHTTP", "Response: " + response.body().string()); // 注意:调用string()后流会关闭! return response; }) .build();
LiveData/ViewModel
Observer
中添加日志,确认数据是否更新 viewModelScope
是否因生命周期导致任务未执行 viewModel.data.observe(this) { data -> Log.d("LIVEDATA", "Data updated: $data") }
RecyclerView适配器
notifyItemChanged/RangeChanged
Adapter
的getItemCount
是否返回正确值 问题描述 | 原因分析 | 解决方案 |
---|---|---|
数据保存后未生效 | 缓存未刷新/写入失败 | 强制调用apply() ,检查文件/数据库路径是否正确 |
Retrofit返回数据为空 | 接口地址错误/服务器返回异常 | 开启OkHttp日志,检查BaseUrl与接口路径拼接 |
LiveData数据不更新 | 生命周期感知失效/观察者未注册 | 确保在onCreate 或onViewCreated 中注册Observer |
A1:
Adapter
的onBindViewHolder
方法,确认数据绑定逻辑正确(如position
是否越界)。 onBindViewHolder
中添加日志,打印当前position
和数据值: @Override public void onBindViewHolder(...) { Log.d("RecyclerView", "Binding position: " + position + ", data: " + data.get(position)); // 绑定逻辑 }
LayoutManager
是否正确设置,且Adapter
的getItemCount
返回实际数据量。A2:
synchronized
或Lock
,确保线程安全。 Thread.sleep()
模拟延迟:在关键代码处添加延迟,复现数据竞争问题。 Log.d("DATA_DEBUG", "Thread: " + Thread.currentThread().getName() + ", Data: " + data);
Thread Dump
功能,分析线程堆