2017-04-04 179 views
0

我试图下载我上传到Firebase存储上的JSON文件。我尝试了一些东西,但没有为我工作。从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) 

谁能请帮助我如何解决这个问题?

+0

发布您的错误日志。 –

+0

你真的需要做这个程序吗? –

+0

你有任何其他建议吗? –

回答

0

您忽略了文件下载的异步性质。下载完成后,成功和失败侦听器才会运行。当您从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; 
} 
+0

它仍然没有下载任何东西,并返回null –

+0

好吧现在它的工作,我认为在你的答案是问题是与行BufferedReader读取器=新的BufferedReader(新的InputStreamReader new FileInputStream(localFile)));'所以我用'InputStream inputStream = new FileInputStream(file);'替换了它,并且它开始读取并返回所需的json字符串。 –