我使用以下代码使用 android azure 存储 API:
try
{
// Retrieve storage account from connection-string.
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.getContainerReference("appstar");
// Loop over blobs within the container and output the URI to each of them.
for (ListBlobItem blobItem : container.listBlobs()) {
System.out.println(blobItem.getUri());
}
// hide dat loader
progress.dismiss();
}
catch (Exception e)
{
System.out.println("There was a problem");
// Output the stack trace.
e.printStackTrace();
// hide dat loader
progress.dismiss();
}
但是当我进入 for 循环时,出现以下错误:
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ java.util.NoSuchElementException: An error occurred while enumerating the result, check the original exception for details.
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at com.microsoft.azure.storage.core.LazySegmentedIterator.hasNext(LazySegmentedIterator.java:113)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at com.k.azurestorage.ConnectionSettingsForm.btn_onCreateSubmitted(ConnectionSettingsForm.java:127)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at android.view.View$1.onClick(View.java:4015)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at android.view.View.performClick(View.java:4780)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at android.view.View$PerformClick.run(View.java:19866)
07-23 12:30:46.371 2362-2362/com.k.azurestorage W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5257)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ Caused by: com.microsoft.azure.storage.StorageException: Network operations may not be performed on the main thread.
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:224)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at com.microsoft.azure.storage.core.LazySegmentedIterator.hasNext(LazySegmentedIterator.java:109)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ ... 14 more
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ Caused by: android.os.NetworkOnMainThreadException
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at java.net.InetAddress.getAllByName(InetAddress.java:215)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
07-23 12:30:46.372 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
07-23 12:30:46.382 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:125)
07-23 12:30:46.393 2362-2362/com.k.azurestorage W/System.err﹕ ... 15 more
知道这意味着什么吗?
首先,让我们检查一下容易导致奇怪错误的基础知识。 :)
- 您能否确认您正在使用安卓库 https://github.com/Azure/azure-storage-android而不是Java库 https://github.com/Azure/azure-storage-java?
- 您能否确认您的 Android 清单中有互联网权限?看看我们的samples https://github.com/Azure/azure-storage-android/blob/master/microsoft-azure-storage-samples/AndroidManifest.xml举个例子。
如果这些都不是您的问题,那么您可以执行以下操作吗?
- 发布完整的异常跟踪。可迭代 API 要求我们返回 NoSuchElementException,因此我们将异常实际发生的原因包装到其中。完整的堆栈跟踪应该为我们提供进一步调试所需的信息。
- 发布您正在使用的 Android 库的版本以及您正在运行的 Android 版本。根据变更日志 https://github.com/Azure/azure-storage-android/blob/master/ChangeLog.txt过去我们遇到过一些与可迭代相关的 Android 错误,这将让我们确认您没有遇到这些错误。
将调试步骤留给其他人,但这里完整的堆栈跟踪给出了答案。在完整的跟踪跟踪中,您可以看到 NetworkOnMainThreadException ,其中包含消息“网络操作可能无法在主线程上执行”。由于网络操作可能会很慢,Android 默认情况下会阻止它们在主线程上进行。如果您搜索此错误,您将找到有关如何在不阻塞 UI 线程的情况下使用网络操作的各种示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)