Android Azure SDK-当我尝试从blob存储加载某些内容时出现NullPointerException
我已经在Azure上创建了一个名为“assetcontainer”的容器 我按照示例创建了以下代码:Android Azure SDK-当我尝试从blob存储加载某些内容时出现NullPointerException,android,azure,azure-mobile-services,Android,Azure,Azure Mobile Services,我已经在Azure上创建了一个名为“assetcontainer”的容器 我按照示例创建了以下代码: CloudStorageAccount account = CloudStorageAccount.parse(BuildConfig.AzureConnectionString); mClient = account.createCloudBlobClient(); mAssetContainer = mClient.getContainerReference
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()时,收到以下异常:
我不确定这里会出什么问题。。。这是azure sdk的一个bug吗?我从中找到了一个解决方案,它对我很有效
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){}
}
}
}
}
私有类MyTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
CloudStorageAccount=CloudStorageAccount.parse(BuildConfig.AzureConnectionString);
mClient=account.createCloudBlobClient();
mAssetContainer=mClient.getContainerReference(“资产容器”);
//下载blob
//对于容器中的每个项目
对于(ListBlobItem blobItem:mAssetContainer.listBlobs()){
//如果项目是blob,而不是虚拟目录
if(CloudBlockBlob的blobItem实例){
//下载文本
CloudBlockBlob retrievedBlob=(CloudBlockBlob)blobItem;
试一试{
retrievedBlob.download(新文件输出流(mContext.getFilesDir()+“\\assets\\”+((CloudBlockBlob)blobItem.getName());
}
捕获(例外情况除外){}
}
}
}
}
然后在主线程中调用
newmytask().execute()
。我最后也找到了这个!奇怪的是,文档中没有提到这一点,实际的错误有点难以找到@我们发布了新版本的库(0.3.1)来解决这个问题。您可以获取代码。您现在应该会收到正确的错误消息。我正在运行一个任务(在doInBackground()中),但仍然收到此错误。让我失望。
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){}
}
}
}
}