我有下一个方法,它返回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
?
答案 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。这些可能是一场噩梦,因为你没有在调试器中捕获它们,它们只能以全速显示。