【问题标题】:Downloading JSON file from Firebase Storage从 Firebase 存储下载 JSON 文件
【发布时间】:2017-04-04 12:57:55
【问题描述】:

我正在尝试下载我上传到 Firebase 存储的 JSON 文件。我尝试了一些方法,但没有任何效果。

在代码中,null 总是由这个 doInBackground() 方法返回,它无法进一步处理我的应用程序。

protected String doInBackground(String... strings) {
        Log.e("Test", "DOINBG Working..");
        String storageUrl = "https://firebasestorage.googleapis.com/v0/b/frost-bird-1d290." +
                "appspot.com/o/images.json?alt=media&token=b0a511d4-f0ea-4ee0-a063-69b7fd050f49";
        FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
        StorageReference reference = firebaseStorage.getReferenceFromUrl(storageUrl);
        final File localFile;
        try {
            localFile = File.createTempFile("images", "json");
            reference.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(getContext(), "File downloaded successfully.", Toast.LENGTH_SHORT).show();
                    try {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(localFile)));
                        StringBuilder result = new StringBuilder();
                        String line = null;
                        while((line.concat(String.valueOf(reader.read()))) != null){
                            Log.e("Test", "Result - "+ result);
                            result.append(line);
                        }
                        finalRes.concat(result.toString());
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.e("Test", "Failed");
                    Toast.makeText(getContext(), "File downloading failed.", Toast.LENGTH_LONG).show();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.e("Test", "String Downloaded- "+finalRes);
        return finalRes;
    }

protected void onPostExecute(String result) {
        Log.e("Test", "onPostExecute Working.."+"\nString in onPostExecute Method-" +result);
        progressDialog.dismiss();
        List<String> data = new ArrayList<>();
        progressDialog.dismiss();
        try{
            JSONArray jsonArray = new JSONArray(result);

            for(int i=0;i<jsonArray.length();i++){
                JSONObject jObject = jsonArray.getJSONObject(i);
                data.add(jObject.getString("ipl_image"));
            }

            recyclerViewGallery = (RecyclerView) getView().findViewById(R.id.recyclerviewgallery);
            adapter = new GalleryPhotoAdapter(getContext());
            recyclerViewGallery.setAdapter(adapter);
            recyclerViewGallery.setLayoutManager(new LinearLayoutManager(getContext()));
        }
        catch (JSONException e){
            Toast.makeText(getContext(),e.toString(), Toast.LENGTH_LONG).show();
        }
    }

另外我想告诉你,它从不执行onSuccess() 方法。我不知道为什么。

错误日志:

FATAL EXCEPTION: main Process: com.metrowebz.data.ipl2017, PID: 9526
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
  at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
  at org.json.JSONTokener.nextValue(JSONTokener.java:94)
  at org.json.JSONArray.<init>(JSONArray.java:92)
  at org.json.JSONArray.<init>(JSONArray.java:108)
  at com.metrowebz.data.ipl2017.NavDFragments.GalleryFragment$AsyncFetch.onPostExecute(GalleryFragment.java:126)
  at com.metrowebz.data.ipl2017.NavDFragments.GalleryFragment$AsyncFetch.onPostExecute(GalleryFragment.java:61)
  at android.os.AsyncTask.finish(AsyncTask.java:651)

谁能帮我解决这个问题?

【问题讨论】:

  • 发布您的错误日志。
  • 您真的需要以编程方式执行此操作吗?
  • 您还有什么建议吗?
  • 我还上传了 onPostExecute() 代码@DougStevenson。但我认为,它在那里显示错误,因为它正在获取从 doInBackground() 方法传递的空字符串......
  • 此日志打印什么? Log.e("Test", "String Downloaded-"+finalRes);

标签: android json firebase firebase-storage


【解决方案1】:

您忽略了文件下载的异步特性。成功和失败侦听器在下载完成之前不会运行。当你从doInBackground()返回时,成功监听还没有运行,所以finalRes的值还没有设置。

因为您在后台线程中执行此处理,您可以更改代码以等待下载完成。像这样的:

@Override
protected String doInBackground(String... params) {
    Log.e("Test", "DOINBG Working..");
    String storageUrl = "https://firebasestorage.googleapis.com/v0/b/frost-bird-1d290." +
            "appspot.com/o/images.json?alt=media&token=b0a511d4-f0ea-4ee0-a063-69b7fd050f49";
    FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
    StorageReference reference = firebaseStorage.getReferenceFromUrl(storageUrl);
    final File localFile;
    try {
        localFile = File.createTempFile("images", "json");
        FileDownloadTask task = reference.getFile(localFile);
        try {
            Tasks.await(task); // or use await with timeout: Tasks.await(task, 30, TimeUnit.SECONDS)
            if (task.isSuccessful()) {
                Toast.makeText(getContext(), "File downloaded successfully.", Toast.LENGTH_SHORT).show();
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(localFile)));
                    StringBuilder result = new StringBuilder();
                    String line = null;
                    while((line.concat(String.valueOf(reader.read()))) != null){
                        Log.e("Test", "Result - "+ result);
                        result.append(line);
                    }
                    finalRes.concat(result.toString());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("Test", "Failed: " + task.getException().getMessage());
                Toast.makeText(getContext(), "File downloading failed", Toast.LENGTH_LONG).show();
            }
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.e("Test", "String Downloaded- "+finalRes);
    return finalRes;
}

【讨论】:

  • 它仍然没有下载任何东西并且返回null
  • 好的现在它正在工作,我认为在你的回答中问题出在BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(localFile)));这一行所以我用InputStream inputStream= new FileInputStream(file);替换了它,它开始读取并返回所需的json字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2019-12-10
  • 2017-08-22
相关资源
最近更新 更多