回调方法中的操作序列不正确

时间:2014-03-18 09:13:21

标签: java android callback google-drive-api

我有下一个方法,它返回ArrayList<String>来自Google云端硬盘帐户的数据。

public int getMetodsList()
{   final ArrayList<String> result = new ArrayList<String>();
     System.out.println("1");
    Drive.DriveApi.getFolder(MainActivity.mGoogleApiClient, getIDOfFolder("SomeFolder"))
    .listChildren(MainActivity.mGoogleApiClient).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>()
            {
            @Override
            public void onResult(MetadataBufferResult mdbr) {
                 System.out.println("2");
                for (int i = 0; i < mdbr.getMetadataBuffer().getCount(); i++)
                {  result.add(mdbr.getMetadataBuffer().get(i).getTitle());
                }
                 System.out.println("3");
            } }
        );  
    System.out.println("4");
    return result.size();   

要获得帮助,我已将log添加了数字 - System.out.println("number");    当我调用此方法时,Log会返回下一个序列:        1,4,2,3 。    所以我无法在ArrayList

之前调用CallBack()返回

请帮助,如何在ResultCallback<DriveApi.MetadataBufferResult> 之前调用CallBack ** return

2 个答案:

答案 0 :(得分:1)

您正在使用异步方法,因此输出并不令人惊讶。如果要同步访问文件夹内容,请使用await

  

使用此版本的Google Play服务,您现在可以选择指定API调用是否应异步执行(一旦完成就会收到回调),或者同步(线程将阻塞直到操作完成) 。这是通过在com.google.android.gms.common.api包中使用PendingResult,Result和Status类来实现的。

     

实际上,这意味着API操作将返回PendingResult的实例,您可以选择是使用setResultCallback异步执行还是使用await同步执行。   (http://android-developers.blogspot.de/2014/02/new-client-api-model-in-google-play.html)。

答案 1 :(得分:0)

一般情况下,您的问题与GDAA无关,而是ASYNC逻辑结果必须由全局变量的 状态 或< strong> 回调 (这是一般编码原则)。我肯定会建议你从&#34; await&#34;开始版本(您可以拉包装器类"GooApiClnt" from here并将您的完整过程包装在AsyncClass中)。

您不仅可以避免代码中的问题(如上所示),还可以避免其他意外行为,例如in this SO nag - 评论#2,#3。这些可能是一场噩梦,因为你没有在调试器中捕获它们,它们只能以全速显示。