Android应用调用Google Drive API的List.execute()方法无限阻塞,寻求排查方案
看起来你已经做了不少基础配置,但调用execute()时无限阻塞确实很头疼,结合你的代码和描述,给你几个具体的排查方向:
先确认线程环境与请求超时
虽然你提到用Executors在其他线程执行,但还是建议先打印当前线程信息确认是不是真的在后台线程(比如Log.d(TAG, "当前线程:" + Thread.currentThread().getName()))。另外,给API调用加个超时机制,避免无限等待:ExecutorService executor = Executors.newSingleThreadExecutor(); Future<FileList> future = executor.submit(() -> result.execute()); try { // 设置5秒超时,可根据实际情况调整 FileList executed = future.get(5, TimeUnit.SECONDS); return !executed.getFiles().isEmpty(); } catch (TimeoutException e) { e.printStackTrace(); future.cancel(true); Log.e(TAG, "Drive API请求超时,疑似阻塞"); return false; } catch (Exception e) { e.printStackTrace(); return false; } finally { executor.shutdown(); }这样能明确是真的阻塞还是只是请求过慢,同时超时后可以中断任务。
排查API请求的语法与参数问题
你的查询语句是拼接出来的:"'appDataFolder' in parents and name = '" + fileName + "'",如果文件名包含单引号(比如my'file.txt),会直接导致查询语法错误,可能引发服务端无响应或者客户端解析卡住。建议先简化查询,暂时去掉文件名条件,只查'appDataFolder' in parents,看是否能正常返回结果:String query = "'appDataFolder' in parents";如果简化后能正常执行,再考虑手动转义文件名里的单引号(比如把
'替换成\')来避免语法问题。强化日志排查请求细节
你已经给request设置了setLoggingEnabled(true),但需要调整Logcat的日志级别:在Logcat里过滤标签包含GoogleHttpClient或Drive的日志,把级别调到Verbose,这样能看到请求的完整流程(包括是否发送了请求、请求头、响应状态等)。如果完全看不到相关日志,说明请求根本没发出去,问题可能出在Credential初始化或者DriveService创建环节。核对Google Cloud配置细节
再仔细检查一遍Google Cloud Console的配置:- 确认OAuth 2.0客户端ID是Android类型,包名和debug模式下的SHA-1完全匹配(注意debug和release的SHA-1是不同的,debug模式要用
./gradlew signinReport输出的debug版SHA-1); - 确认Google Drive API确实处于启用状态(在API库里搜Drive API,看状态是不是“已启用”);
- 检查OAuth同意屏幕的配置,确保你的测试账号在“测试用户”列表里(未发布的应用只有测试用户能授权)。
- 确认OAuth 2.0客户端ID是Android类型,包名和debug模式下的SHA-1完全匹配(注意debug和release的SHA-1是不同的,debug模式要用
检查DriveService创建的潜在问题
在getDriveService()方法里,打印account.getAccount()的信息,确认账号是有效的(比如Log.d(TAG, "选中的账号:" + account.getAccount().name))。另外,尝试替换HttpTransport实现,GoogleNetHttpTransport在某些设备上可能存在SSL兼容性问题,换成OkHttpTransport试试:
首先添加OkHttp依赖(在build.gradle里):implementation 'com.google.http-client:google-http-client-okhttp:1.43.3'然后修改DriveService的创建代码:
// 替换原来的HttpTransport创建代码 HttpTransport transport = OkHttpTransport.create();排除网络与代理干扰
如果是在debug模式下使用了代理工具(比如Charles、Fiddler),先关闭代理试试,有时候代理配置错误会导致请求卡住。另外,确认测试设备能正常访问Google服务(比如打开浏览器登录Google Drive网页版,看是否能正常加载)。
备注:内容来源于stack exchange,提问作者Gabriele Troviso

