首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Drive REST API connection TimeOut?

Google Drive REST API connection TimeOut?
EN

Stack Overflow用户
提问于 2015-11-22 18:53:47
回答 2查看 2.6K关注 0票数 1

我使用的是drive REST Api (不是Google Drive Android API),当我向Google Drive发送请求时,经常会遇到超时(+- each 5 request)。它可以在我列出文件夹或下载文件时出现,但仅当我发出请求时才会出现。在下载过程中决不会。

对于测试,我使用Wifi连接。互联网连接没有问题。

我按照文档(https://developers.google.com/drive/web/quickstart/android)中的描述创建连接。代码如下:

代码语言:javascript
复制
googleAccountCredential = GoogleAccountCredential.usingOAuth2(activity, Arrays.asList(DriveScopes.DRIVE_FILE));

if (accountName.length() == 0) {
    activity.startActivityForResult(googleAccountCredential.newChooseAccountIntent(), ResultCode.GOOGLE_DRIVE_ACCOUNT_NAME_RESULT_CODE);
    return false;
} else {
    if (!isConnected) {
        googleAccountCredential.setSelectedAccountName(accountName);
        googleAccountCredential.setBackOff(new ExponentialBackOff());

        driveService = new Drive.Builder(AndroidHttp.newCompatibleTransport(), JacksonFactory.getDefaultInstance(), googleAccountCredential)
                .setApplicationName(activity.getString(R.string.app_name))
                .build();

        isConnected = true;
    }

    return true;
}

因此,如果我没有“帐户名”,我会问它,否则我只创建一次连接!(我每次都尝试创建连接,但这不会改变任何事情)

所有请求都是在asyncTask中发出的。

它有时有效,有时无效。

请求超时示例:

1.

代码语言:javascript
复制
request = driveService.files().list();
request.setQ("root in parents AND trashed = false");
fileList = request.execute();// Time-out

2.

代码语言:javascript
复制
HttpResponse resp = driveService.getRequestFactory().buildGetRequest(new GenericUrl(url)).execute();// Time-out

编辑:

下面是转储文件:

代码语言:javascript
复制
W/System.err: java.net.SocketTimeoutException: timeout
W/System.err: at com.android.okhttp.okio.Okio$3.newTimeoutException(Okio.java:207)
W/System.err: at com.android.okhttp.okio.AsyncTimeout.exit(AsyncTimeout.java:250)
W/System.err: at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:217)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
W/System.err: at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
W/System.err: at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
W/System.err: at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:904)
W/System.err: at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:788)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java)
W/System.err: at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:37)
W/System.err: at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94)
W/System.err: at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972)
W/System.err: at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
W/System.err: at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
W/System.err: at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
W/System.err: at org.team.acs.scubalog.share.cloud.googleDrive.asynckTask.GoogleDriveGetDirectoryListAsyncTask.doInBackground(GoogleDriveGetDirectoryListAsyncTask.java:60)
W/System.err: at org.team.acs.scubalog.share.cloud.googleDrive.asynckTask.GoogleDriveGetDirectoryListAsyncTask.doInBackground(GoogleDriveGetDirectoryListAsyncTask.java:20)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-03-13 10:45:43

对于其他有这个问题的人,这对我很有效:

代码语言:javascript
复制
    private static HttpRequestInitializer setHttpTimeout(final HttpRequestInitializer requestInitializer) {
            return new HttpRequestInitializer() {
                @Override
                public void initialize(HttpRequest httpRequest) throws IOException {
                    requestInitializer.initialize(httpRequest);
                    httpRequest.setConnectTimeout(3 * 60000);  // 3 minutes connect timeout
                    httpRequest.setReadTimeout(3 * 60000);  // 3 minutes read timeout
                }
            };
        }


 @Nullable
    public static DriveServiceHelper create(Context context) {

        Set<Scope> requiredScopes = new HashSet<>(2);
        requiredScopes.add(new Scope(DriveScopes.DRIVE_APPDATA));
        requiredScopes.add(new Scope(DriveScopes.DRIVE_FILE));

        GoogleSignInAccount signInAccount = GoogleSignIn.getLastSignedInAccount(context);
        if (signInAccount != null && signInAccount.getGrantedScopes().containsAll(requiredScopes)) {




            // Use the authenticated account to sign in to the Drive service.
            GoogleAccountCredential credential =
                    GoogleAccountCredential.usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE_APPDATA));
            credential.setSelectedAccount(signInAccount.getAccount());
            com.google.api.services.drive.Drive googleDriveService =
                    new com.google.api.services.drive.Drive.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new GsonFactory(),
                            setHttpTimeout(credential))
                            .setApplicationName(context.getString(R.string.app_name))
                            .build();

            return new DriveServiceHelper(googleDriveService);
        }

        return null;
    }

参考:https://developers.google.com/api-client-library/java/google-api-java-client/errors

票数 3
EN

Stack Overflow用户

发布于 2015-11-23 07:19:33

我在你的代码中看不到任何明显的错误,事实上,我已经成功地使用了非常类似的结构:

代码语言:javascript
复制
  com.google.api.services.drive.Drive driveService =
    new Drive.Builder(
      AndroidHttp.newCompatibleTransport(),
      new GsonFactory(),
      GoogleAccountCredential
        .usingOAuth2(activity.getApplicationContext(), Collections.singletonList(DriveScopes.DRIVE_FILE))
        .setSelectedAccountName(accountName)
  ).build();

因此,让我们来看看它们之间的区别(不是说这就是解决方法):

1/ i未指定'.setBackOff(new ExponentialBackOff())‘策略

2/ i使用“activity.getApplicationContext()”代替activity context

3/我不知道您的用户电子邮件(accountName)来自何处。它必须是在设备上注册的帐户之一,可以通过以下方式实现:

  • 标准安卓设置>帐户菜单> Add account
  • 没有指定'setSelectedAccountName(accountName)',这会导致帐户选择器弹出,允许用户选择已注册的帐户或添加一个新的
  • 在您的活动中调用帐户选择器并从activity获取电子邮件

第3/点很可能不会导致您的问题,它将返回不同的错误消息。

所有这些都可以在RESTDemo here中看到(参见REST.init()REQ_ACCPICK)。

祝好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33853978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档