【问题标题】:java.lang.IllegalStateException: Result has already been consumedjava.lang.IllegalStateException: 结果已经被消费
【发布时间】:2016-04-16 02:53:03
【问题描述】:

我目前正在研究在 Android 设备与 Google Drive 之间同步数据的方法,偶然发现了 https://github.com/googledrive/android-quickeditor 的示例代码,但在打开现有文件然后点击“保存更改”时遇到了问题.基本上有问题的代码就在这里:

@Override
protected com.google.android.gms.common.api.Status doInBackground(DriveId... params) {
    R await;

    DriveFile file = params[0].asDriveFile();
    PendingResult<DriveContentsResult> openDriveContentsResult = file.open(mClient, DriveFile.MODE_WRITE_ONLY, null);

    if (!openDriveContentsResult.await().getStatus().isSuccess()) {
        return openDriveContentsResult.await().getStatus();
    }

    Changes changes = edit(openDriveContentsResult.await().getDriveContents());
    PendingResult<MetadataResult> metadataResult = null;
    PendingResult<com.google.android.gms.common.api.Status> closeContentsResult = null;

    if (changes.getMetadataChangeSet() != null) {
        metadataResult = file.updateMetadata(mClient, changes.getMetadataChangeSet());
        if (!metadataResult.await().getStatus().isSuccess()) {
            return metadataResult.await().getStatus();
        }
    }

    if (changes.getDriveContents() != null) {
        closeContentsResult = changes.getDriveContents().commit(mClient, null);
        closeContentsResult.await();
    }
    return closeContentsResult.await().getStatus();
}

引发错误的确切行是:

Changes changes = edit(openDriveContentsResult.await().getDriveContents());

错误是java.lang.IllegalStateException: Result has already been consumed。我提到了 PendingResult 类引用,它清楚地指出“使用await() 检索结果或传递给结果回调后,再次尝试检索结果是错误的。”我猜很公平。

问题是,我应该如何正确解决这个问题?我已经注释掉了

if (!metadataResult.await().getStatus().isSuccess()) {...} 

现在为了避免调用await() 两次(为了调试),但是(如预期的那样)然后在

处导致相同的错误
return closeContentsResult.await().getStatus();

那么...我该如何解决这个问题?漂亮吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    解决了。对于任何对此感到沮丧的人:

    @Override
    protected com.google.android.gms.common.api.Status doInBackground(DriveId... params)
    {
        R await;
        DriveFile file;
        Changes changes;
        PendingResult<DriveContentsResult> openDriveContentsResult;
        DriveContentsResult driveContentsResult;
        PendingResult<MetadataResult> updateMetadataResult;
        MetadataResult metaDataResult;
        PendingResult<com.google.android.gms.common.api.Status> commitResults;
        com.google.android.gms.common.api.Status closeContentResults = null;
    
        file                    = params[0].asDriveFile();
        openDriveContentsResult = file.open(mClient, DriveFile.MODE_WRITE_ONLY, null);
    
        driveContentsResult     = openDriveContentsResult.await();
        if (!driveContentsResult.getStatus().isSuccess())
        {
            return driveContentsResult.getStatus();
        }
    
        changes                 = edit(driveContentsResult.getDriveContents());
        updateMetadataResult    = null;
        commitResults           = null;
    
        if (changes.getMetadataChangeSet() != null)
        {
            updateMetadataResult = file.updateMetadata(mClient, changes.getMetadataChangeSet());
            metaDataResult       = updateMetadataResult.await();
    
            if (!metaDataResult.getStatus().isSuccess())
            {
                return metaDataResult.getStatus();
            }
        }
    
        if (changes.getDriveContents() != null)
        {
            commitResults = changes.getDriveContents().commit(mClient, null);
            closeContentResults = commitResults.await();
        }
    
        if (null == commitResults)
        {
            return commitResults.await().getStatus();
        }
        else
        {
            return closeContentResults.getStatus();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      相关资源
      最近更新 更多