You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用调用Google Drive API的List.execute()方法无限阻塞,寻求排查方案

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同意屏幕的配置,确保你的测试账号在“测试用户”列表里(未发布的应用只有测试用户能授权)。
  • 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:12:59