2014-12-21 5 views
2

나는 자동 사용자 생성을 사용하여 익명 사용자를 사용하는 Parse Android 응용 프로그램을 작성 중입니다. 이 사용자를 성공적으로 가입 (익명 사용자를 일반 사용자로 변환) 한 후 로그인하십시오. 두 호출이 모두 성공적으로 리턴됩니다. 그런 다음 사용자 개체에 데이터를 설정하고 사용자를 저장하려고하면 ParseObject 클래스에 stackoverflow가 생깁니다.익명 사용자를 일반 사용자로 변환하여 저장

내 코드는 (예를 들어 단순 코드)과 같은 다음에 ParseUser saveInBackground 호출시

user.setUsername("MyUserName"); 
    final String password = new PasswordGenerator().nextSessionId(); 
    user.setPassword(password); 
    try { 
     user.signUp(); 
     ParseUser.logInInBackground(verification.getPhoneNumber(), password, new  LogInCallback() { 
      @Override 
      public void done(final ParseUser parseUser, final ParseException e) { 
       if (parseUser == null) { 
        requestListener.onError(e); 
       } else { 
        parseUser.put("phone_no", "123"); 
        parseUser.saveInBackground(new SaveCallback() { // This generates a stackoverflow 
         @Override 
         public void done(final ParseException e) { 
          int i = 0; 
          System.out.println("i = " + i); 
         } 
        }); 
//        requestListener.onSuccess(null); 
       } 
      } 
     }); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

스택 오버 플로우가 발생한다. stackoverflow는 다음과 같습니다.

java.lang.StackOverflowError 
     at com.parse.ParseObject.isDataAvailable(ParseObject.java:3212) 
     at com.parse.ParseObject.checkGetAccess(ParseObject.java:3284) 
     at com.parse.ParseObject.getString(ParseObject.java:2867) 
     at com.parse.ParseUser.getUsername(ParseUser.java:401) 
     at com.parse.ParseUser.signUpAsync(ParseUser.java:665) 
     at com.parse.ParseUser.resolveLazinessAsync(ParseUser.java:1397) 
     at com.parse.ParseUser.saveAsync(ParseUser.java:502) 
     at com.parse.ParseUser.signUpAsync(ParseUser.java:681) 
     at com.parse.ParseUser.resolveLazinessAsync(ParseUser.java:1397) 
     at com.parse.ParseUser.saveAsync(ParseUser.java:502) 
     at com.parse.ParseUser.signUpAsync(ParseUser.java:681) 

사용하는 구문 분석 버전은 1.8.0입니다.

아이디어가 있으십니까?

답변

3

해결책을 찾았습니다! 사용자를 등록 된 사용자로 변환하기 전에 먼저 익명 사용자를 저장해야한다는 사실이 드러납니다. 사용자를 먼저 저장하고 등록 된 사용자로 변환 한 다음 saveInBackground를 수행하면 스택 오버 플로우가 발생하지 않습니다. 따라서 익명 사용자를 변환하는 전체 코드는 다음과 같습니다.

final String accountUsername = username.getText().toString(); 
final String accountPassword = password.getText().toString(); 
final ParseUser user = ParseUser.getCurrentUser(); 
user.setUsername(accountUsername); 
user.setPassword(accountPassword); 
user.signUpInBackground(new SignUpCallback() { 
    @Override 
    public void done(final ParseException e) { 
     if (e != null) { 
      Toast.makeText(MainActivity.this, "Signup Fail", Toast.LENGTH_SHORT).show(); 
      e.printStackTrace(); 
     } else { 
      Toast.makeText(MainActivity.this, "Signup success", Toast.LENGTH_SHORT).show(); 
      final ParseUser user = ParseUser.getCurrentUser(); 
      user.put("phone_no", "31743379507"); 
      user.saveInBackground(new SaveCallback() { 
       @Override 
       public void done(final ParseException e) { 
        if (e != null) { 
         Toast.makeText(MainActivity.this, "Save data Fail", Toast.LENGTH_SHORT).show(); 
         e.printStackTrace(); 
        } else { 
         Toast.makeText(MainActivity.this, "Save data success", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
     } 
    } 
}); 

SignupCallback의 saveInBackground는 선택 사항입니다. signUpInBackground가 호출되기 전에이 데이터를 사용자에게 설정하고 추가 왕복을 저장할 수도 있습니다. 이는 데모 목적으로는 순수합니다.

또한,이 가정 다음 코드는 익명 사용자를 허용하도록 응용 프로그램 클래스에 배치됩니다 : 여기

ParseUser.enableAutomaticUser(); 
ParseUser.getCurrentUser().saveInBackground(); 

는 사용자가 즉시이 만들어 저장을 참조하십시오.

1
findViewById(R.id.createUser).setOnClickListener(newView.OnClickListener() {   
    @Override 

     public void onClick(final View v) { 

      final String accountUsername = username.getText().toString(); 

      final String accountPassword = password.getText().toString(); 

      final ParseUser user = ParseUser.getCurrentUser(); 

      user.setUsername(accountUsername); 

      user.setPassword(accountPassword); 

      user.signUpInBackground(new SignUpCallback() { 

       @Override 

       public void done(final ParseException e) { 

        if (e != null) { 

         Toast.makeText(MainActivity.this, "Signup Fail", 
Toast.LENGTH_SHORT).show(); 

    Log.e(TAG, "Signup fail", e); 

    } else 
{    Toast.makeText(MainActivity.this,"Signupsuccess",Toast.LENGTH_SHORT).show(); 

         final ParseUser user = ParseUser.getCurrentUser(); 

         user.put("phone_no", "31612345678"); 

         user.saveInBackground(new SaveCallback() { 

          @Override 

          public void done(final ParseException e) { 

           if (e != null) { 

Toast.makeText(MainActivity.this, "Save data Fail",    Toast.LENGTH_SHORT).show(); 

    Log.e(TAG, "Signup fail", e); 

           } else { 
            Toast.makeText(MainActivity.this, "Save 
data success", Toast.LENGTH_SHORT).show(); 
           } 
          } 
         }); 
        } 
       } 
      }); 
     } 
    }) 
관련 문제