getBytes не работает с прослушивателями .OnSuccss или .OnFailure в пределах базы данных .OnDataChange - PullRequest
0 голосов
/ 17 января 2019

Я запускаю addValueEventListener для моей базы данных Firebase методом, который запускает onClick кнопки. он извлекает снимок данных с данными пользователя, а затем запускает цикл for, который присваивает переменные точкам данных, чтобы их можно было сохранить в базе данных sqlite. последний шаг - проверить, существует ли URL-адрес firebaseStorage, указывающий на наличие сохраненного изображения как части данных пользователя для данной «дыры», и если это так, его необходимо преобразовать в байтовый массив. если его нет, приложение определяет байтовый массив как ноль, а затем в обоих случаях приложение должно .put данные в базу данных.

Я обнаружил, что цикл for работает беспорядочно, то есть не завершает процесс по порядку. Кроме того, в большинстве случаев, даже несмотря на то, что в моментальном снимке данных четко присутствуют данные, они не сохраняются в переменной 90% времени. наконец, в некоторых случаях, хотя есть greenURL, приложение не слушает .onSuccess или .onFailure.

похоже, что это проблема синхронизации, связанная с тем, что onDataChange является асинхронным. Я попытался создать его так, чтобы он не продвигался до завершения процесса, но, возможно, я ошибаюсь. вот мой код:

String  holeNumbers[] = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18"};
    SharedPreferences preferences = getApplicationContext().getSharedPreferences("MyPreferences", MODE_PRIVATE);
    String selectedCourse = preferences.getString("selectedCourse","");
myDb = FirebaseDatabase.getInstance().getReference();
    myDb.child("UserNotesData").child("Users").child(uid).child(selectedCourse).child(selectedNotes).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
          for  (String x:holeNumbers) {
              String hole = "Hole"+x ;
              String holeNumberNotes = x;

              System.out.println("Hole at beginning of DownloadUserNotesData for loop: "+ x);
              if (dataSnapshot.child(hole).child("ApproachIdealMiss").getValue() != null) {
                  approachIdealMiss = dataSnapshot.child(hole).child("ApproachIdealMiss").getValue().toString();
              } else {
                  approachIdealMiss = "";
              }


              if (dataSnapshot.child(hole).child("ApproachNotes").getValue() != null) {
                  approachNotes = dataSnapshot.child(hole).child("ApproachNotes").getValue().toString();
              } else {
                  approachNotes = "";
              }
              String greenImageURL;
              if (dataSnapshot.child(hole).child("GreenImageURL").getValue() != null) {
                  greenImageURL =  dataSnapshot.child(hole).child("GreenImageURL").getValue().toString();
              } else {
                  greenImageURL = "N/A";
              }

              if (dataSnapshot.child(hole).child("GreenNotes").getValue() != null) {
                  greenNotes = dataSnapshot.child(hole).child("GreenNotes").getValue().toString();
              } else {
                  greenNotes = "";
              }

              if (dataSnapshot.child(hole).child("TeeIdealMiss").getValue() != null) {
                  teeIdealMiss = dataSnapshot.child(hole).child("TeeIdealMiss").getValue().toString();
              } else {
                  teeIdealMiss = "";
              }

              if (dataSnapshot.child(hole).child("TeeNotes").getValue() != null) {
                  teeNotes = dataSnapshot.child(hole).child("TeeNotes").getValue().toString();
              } else {
                  teeNotes = "";
              }
              if (dataSnapshot.child(hole).child("TeeShot").getValue() != null) {
                  teeShot = dataSnapshot.child(hole).child("TeeShot").getValue().toString();
              } else {
                  teeShot = "";
              }

              if (dataSnapshot.child(hole).child("goZone1X").getValue() != null) {
                  goZone1X = dataSnapshot.child(hole).child("goZone1X").getValue().toString();
              } else {
                  goZone1X = "";
              }

              if (dataSnapshot.child(hole).child("goZone1Y").getValue() != null) {
                  goZone1Y = dataSnapshot.child(hole).child("goZone1Y").getValue().toString();
              } else {
                  goZone1Y = "";
              }

              if (dataSnapshot.child(hole).child("goZone2X").getValue() != null) {
                  goZone2X = dataSnapshot.child(hole).child("goZone2X").getValue().toString();
              } else {
                  goZone2X = "";
              }

              if (dataSnapshot.child(hole).child("goZone2Y").getValue() != null) {
                  goZone2Y = dataSnapshot.child(hole).child("goZone2Y").getValue().toString();
              } else {
                  goZone2Y = "";
              }

              if (dataSnapshot.child(hole).child("noZone1X").getValue() != null) {
                  noZone1X = dataSnapshot.child(hole).child("noZone1X").getValue().toString();
              } else {
                  noZone1X = "";
              }

              if (dataSnapshot.child(hole).child("noZone1Y").getValue() != null) {
                  noZone1Y = dataSnapshot.child(hole).child("noZone1Y").getValue().toString();
              } else {
                  noZone1Y = "";
              }

              if (dataSnapshot.child(hole).child("noZone2X").getValue() != null) {
                  noZone2X = dataSnapshot.child(hole).child("noZone2X").getValue().toString();
              } else {
                  noZone2X = "";
              }

              if (dataSnapshot.child(hole).child("noZone2Y").getValue() != null) {
                  noZone2Y = dataSnapshot.child(hole).child("noZone2Y").getValue().toString();
              } else {
                  noZone2Y = "";
              }

              if(!greenImageURL.equals("N/A")) {
              StorageReference greenStorageRef = storage.getReferenceFromUrl(greenImageURL);
              final long ONE_MEGABYTE = 1024 * 1024;
              greenStorageRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
                  @Override
                  public void onSuccess(byte[] bytes) {

                      helperDB.insertUserNotesData(x, approachIdealMiss, approachNotes, greenImageURL, bytes,
                              greenNotes, teeIdealMiss, teeNotes, teeShot, goZone1X, goZone1Y, goZone2X, goZone2Y, noZone1X, noZone1Y, noZone2X, noZone2Y);
                      System.out.println("(greenImageSuccess) hole# to be written in db is: " + x);
                      System.out.println("(greenImageSuccess) TeeNotes to be written in db are: " + approachNotes);


                  }
              })
              .addOnFailureListener(new OnFailureListener() {
                  @Override
                  public void onFailure(@NonNull Exception exception) {
                      // Handle any errors
                      System.out.println("(greenImage was not blank but failed to be changed to bytes) hole# to be written in db is: "+ x);
                  }
              }); }
              else {



                  byte[] emptyByte = new byte[0];
                  helperDB.insertUserNotesData(x, approachIdealMiss, approachNotes, greenImageURL, emptyByte,
                          greenNotes, teeIdealMiss, teeNotes, teeShot, goZone1X, goZone1Y, goZone2X, goZone2Y, noZone1X, noZone1Y, noZone2X, noZone2Y);
                  System.out.println("(greenImageBlank) hole# to be written in db is: "+ x);
                  System.out.println("(greenImageBlank) TeeNotes to be written in db are: "+approachNotes);

              }



            }

            loadingPercent = loadingPercent + 30;
            loadingProgressBar.setProgress(loadingPercent, true);
            System.out.println("loadingProgress at DownloadUserNotesData: " + loadingPercent.toString());

            if (loadingPercent==100) {
                Intent intent = new Intent (courseSelect.this, PlayNav.class);
                startActivity(intent);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

Вот соответствующая (ish) распечатка из консоли, которую я попытался использовать для отладки:

V/FA: Processing queued up service tasks: 4
D/EGL_emulation: eglMakeCurrent: 0xa7805780: ver 3 0 (tinfo 0xa78039e0)
I/System.out: (greenImageSuccess) hole# to be written in db is: 2
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 3
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 1
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 6
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 11
I/System.out: (greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 8
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 12
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 10
I/System.out: (greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is: 14
(greenImageSuccess) TeeNotes to be written in db are: 
W/Google Maps Android API: Deprecation notice: In a future release,     indoor will no longer be supported on satellite, hybrid or terrain type maps. Even where indoor is not supported, isIndoorEnabled() will continue to return the value that has been set via setIndoorEnabled(), as it does now. By default, setIndoorEnabled is 'true'. The API release notes (https://developers.google.com/maps/documentation/android-api/releases) will let you know when indoor support becomes unavailable on those map types.
I/System.out: (greenImageSuccess) hole# to be written in db is: 13
(greenImageSuccess) TeeNotes to be written in db are: 
I/System.out: (greenImageSuccess) hole# to be written in db is

1 Ответ

0 голосов
/ 17 января 2019

Решение моей проблемы было в два раза.

Первым делом я поместил loading percent в цикл for, чтобы он выполнял намерение только после завершения каждого элемента в массиве. во-вторых, я поместил все свои переменные в цикл for вместо того, чтобы создавать их на уровне класса. это гарантировало, что все переменные были правильно установлены в datasnapshot, и что приложение не переходило к следующему действию без полного завершения цикла for.

...