【问题标题】:Android Azure SDK - NullPointerException when I try to load something from blob storageAndroid Azure SDK - 当我尝试从 Blob 存储加载某些内容时出现 NullPointerException
【发布时间】:2014-09-13 20:43:38
【问题描述】:

我在 Azure 上创建了一个名为“assetcontainer”的容器。

我按照示例创建了以下代码:

 CloudStorageAccount account = CloudStorageAccount.parse(BuildConfig.AzureConnectionString);
        mClient = account.createCloudBlobClient();
        mAssetContainer = mClient.getContainerReference("assetcontainer");


        // Download the blob
        // For each item in the container
        for (ListBlobItem blobItem : mAssetContainer.listBlobs()) {
            // If the item is a blob, not a virtual directory
            if (blobItem instanceof CloudBlockBlob) {
                // Download the text
                CloudBlockBlob retrievedBlob = (CloudBlockBlob) blobItem;

                try {
                    retrievedBlob.download(new FileOutputStream(mContext.getFilesDir() + "\\assets\\" + ((CloudBlockBlob) blobItem).getName()));
                }
                catch(Exception ex){}
            }
        }

当我尝试迭代 listBlobs() 时,我收到以下异常:

Process: com.training.app.debug, PID: 3284
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.training.app.debug/com.training.app.activities.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2350)
            at android.app.ActivityThread.access$800(ActivityThread.java:163)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1257)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5335)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:783)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:347)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
            at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:145)
            at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:252)
            at com.microsoft.azure.storage.core.LazySegmentedIterator.hasNext(LazySegmentedIterator.java:109)
            at com.training.azure.AzureStorage.syncAssets(AzureStorage.java:57)
            at com.training.app.activities.MainActivity.onCreate(MainActivity.java:52)
            at android.app.Activity.performCreate(Activity.java:5389)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2256)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2350)
            at android.app.ActivityThread.access$800(ActivityThread.java:163)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1257)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5335)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

我不确定这里可能出了什么问题...这是 azure sdk 的错误吗?

【问题讨论】:

    标签: android azure azure-mobile-services


    【解决方案1】:

    我从this page 找到了一个解决方案,它对我有用。

    Android 不允许在主线程中执行网络操作,因此需要在异步任务中执行代码,如下所示:

    private class MyTask extends AsyncTask<Void, Void, Void>{
     @Override
    protected Void doInBackground(Void... params) {
        CloudStorageAccount account = CloudStorageAccount.parse(BuildConfig.AzureConnectionString);
        mClient = account.createCloudBlobClient();
        mAssetContainer = mClient.getContainerReference("assetcontainer");
    
    
        // Download the blob
        // For each item in the container
        for (ListBlobItem blobItem : mAssetContainer.listBlobs()) {
            // If the item is a blob, not a virtual directory
            if (blobItem instanceof CloudBlockBlob) {
                // Download the text
                CloudBlockBlob retrievedBlob = (CloudBlockBlob) blobItem;
    
                try {
                    retrievedBlob.download(new FileOutputStream(mContext.getFilesDir() + "\\assets\\" + ((CloudBlockBlob) blobItem).getName()));
                }
                catch(Exception ex){}
            }
        }
    }
    }
    

    然后你在主线程中调用new MyTask().execute()

    【讨论】:

    • 我最终也找到了这个!奇怪的是文档没有在任何地方提到这一点,实际的错误有点难以找到!
    • @Mr_E 我们已经发布了一个新版本的库 (0.3.1) 来解决这个问题。您可以获取代码here。您现在应该会收到正确的错误消息。
    • 我正在执行一项任务(在 doInBackground() 中)并且仍然收到此错误。真烦我。
    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 2019-10-01
    • 2018-10-14
    • 2017-08-16
    • 2018-09-24
    • 2015-06-20
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多