2

J'essaie de télécharger/enregistrer 3 images & 4 champs de texte à la fois sur Firebase.App s'écraser donnant erreur 'java.lang.StackOverflowError: stack 8MB' lors de l'enregistrement des données sur firebase

Voici mon code:

if (!pDescription.getText().toString().isEmpty()) { 
      if (!pDuration.getText().toString().isEmpty()) { 
       if (!pPrice.getText().toString().isEmpty()) { 
        if (imageArray != null) { 
         if (imageArray.size() > 0) { 
          for (int i=0; i<imageArray.size(); i++) { 

           Uri file = Uri.fromFile(new File(imageArray.get(i).toString())); 

           Log.d("CALLED", "YES1"); 

           String key = database.getReference().push().getKey(); 

           UploadTask uploadTask = storage.getReference().child(AccessToken.getCurrentAccessToken().getUserId()).child(key).child("p_image").putFile(file); 
           uploadTask.addOnFailureListener(new OnFailureListener() { 
            @Override 
            public void onFailure(@NonNull Exception exception) { 
             // Handle unsuccessful uploads 
            } 
           }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
            @Override 
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
             // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. 
             @SuppressWarnings("VisibleForTests") 
             Uri downloadUrl = taskSnapshot.getDownloadUrl(); 
             imageUrls.add(downloadUrl.toString()); 
             String id = database.getReference().push().getKey(); 
             database.getReference().child(AccessToken.getCurrentAccessToken().getUserId()).child(id).child("pDescription").setValue(pDescription.getText().toString()); 
             database.getReference().child(AccessToken.getCurrentAccessToken().getUserId()).child(id).child("pDuration").setValue(pDuration.getText().toString()); 
             database.getReference().child(AccessToken.getCurrentAccessToken().getUserId()).child(id).child("pPrice").setValue(pPrice.getText().toString()); 
             if (imageUrls != null) { 
              for (int i=0; i<imageUrls.size(); i++) { 
               Log.d("imageUrlsSize", String.valueOf(imageUrls.size())); 
               // everything is working fine above this line 
               // this text is not getting saved on firebase 
               String idtwo = database.getReference().push().getKey(); 
               database.getReference().child(AccessToken.getCurrentAccessToken().getUserId()).child(id).child(idtwo).child("imageUrl").setValue(downloadUrl); 
              } 
             } 
             Toast.makeText(getBaseContext(), "Posted successfully!", Toast.LENGTH_SHORT).show(); 
            } 
           }); 
          } 
         } else { 
          Snackbar snackbar = Snackbar 
            .make(coordinatorLayout, "Upload p's image", Snackbar.LENGTH_SHORT); 
          snackbar.show(); 
         } 
        } 

       } else { 
        Snackbar snackbar = Snackbar 
          .make(coordinatorLayout, "aaa", Snackbar.LENGTH_SHORT); 
        snackbar.show(); 
       } 
      } else { 
       Snackbar snackbar = Snackbar 
         .make(coordinatorLayout, "bbb", Snackbar.LENGTH_SHORT); 
       snackbar.show(); 
      } 
     } else { 
      Snackbar snackbar = Snackbar 
        .make(coordinatorLayout, "ccc", Snackbar.LENGTH_LONG); 
      snackbar.show(); 
     } 

Les images et les 3 champs de texte sont sauvées avec succès, mais je pense que lorsque le code dans la ligne indiquée au-dessus est atteinte, application se bloque donnant cette erreur: java.lang.StackOverflowError: stack size 8MB.

Pourquoi cela se produit-il?

S'il vous plaît aidez-moi.

+1

https://stackoverflow.com/questions/41567576/error-java-lang-stackoverflowerror-when-try-to-save-object-in-firebase-databa –

+1

@NovoLucas Cela a fonctionné. Vous pouvez poster une réponse ici si vous le souhaitez. Je vais accepter et upvote. –

Répondre

0

Cela se produit parce que vous essayez de télécharger des données vers Firebase qui est plus grande que la taille maximale prise en charge. Pour résoudre ce problème, vous devez télécharger des données dans de petits paquets, afin que Firebase accepte ces données.

0

Il se peut que votre classe Member contienne un champ de type Uri.

Uri is not one of the native types that Firebase serializes.

Changer votre classe membre pour stocker l'Uri comme une chaîne et utiliser Uri.toString() et Uri.parse() pour convertir. Le lien vers l'article original est here.