Парольная авария при создании пользователя
Я использую Parse в качестве моего бэкенда для своего приложения для Android. У меня есть отчет о сбоях только для некоторых устройств Android, когда я пытаюсь создать объект User. Ошибка при сбое:
Caused by: java.lang.IllegalArgumentException:
You must register this ParseObject subclass before instantiating it.
at com.parse.ParseObject.<init>(ParseObject.java:184)
Устройства, которые отправили отчет о сбое:
HTC Desire 510 (htc_a11ul) 2 33.3% Android 4.4
Xperia E3 (D2203) 1 16.7% Android 4.4
Galaxy S4 (jflte) 1 16.7% Android 4.4
Galaxy S5 (klte) 1 16.7% Android 4.4
Это очень странно, поскольку в настоящее время я тестировал свой код на Samsung Note 4, Galaxy S4, S5 и Nexus 5 без каких-либо проблем. Я не уверен, почему Parse просит меня подкласс из ниоткуда, поскольку я не пытаюсь использовать функциональные возможности подкласса, предлагаемые Parse. Опять же, я тестировал этот код на других устройствах без каких-либо проблем.
Может кто-нибудь, пожалуйста, скажите мне, как это исправить? Я включил код ниже, где я создаю пользователя, и он сработает.
Спасибо!
Parse.initialize(this, "XXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXX");
ParseUser user = new ParseUser();
user.setUsername(email);
user.setPassword(confirmPassword);
user.setEmail(email);
user.put("deviceID", deviceID);
user.put("name", fullName);
progress = new ProgressDialog(Register.this);
progress.setMessage("Creating Account... Please Wait");
progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progress.setIndeterminate(true);
progress.setCanceledOnTouchOutside(false);
progress.setCancelable(false);
progress.show();
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
// Hooray! Let them use the app now.
Intent i = new Intent(Register.this, DeviceSettingsIntro.class);
startActivity(i);
progress.hide();
btnRegister.setEnabled(true);
} else {
// Sign up didn't succeed. Look at the ParseException
// to figure out what went wrong
progress.hide();
checkParseError(e);
btnRegister.setEnabled(true);
}
}
});
Ответы
Ответ 1
Вы пытались инициализировать Parse
с помощью класса Application
, как описано в Parse
кратком руководстве по началу работы? Возможно, Parse
не был успешно инициализирован
Создайте класс, расширяющий приложение, и для содержимого:
@Override
public void onCreate() {
super.onCreate();
Parse.enableLocalDatastore(this); //might not be needed
Parse.initialize(this, "xxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxx");
}
Отредактируйте свой манифест <application> , добавьте это:
android:name="com.yourpackage.applicationclass"
//so it should look like (for example) :
<application
android:name="com.yourpackage.yourapplicationclass"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
//put activities here
</application>
Таким образом, Parse всегда будет инициализироваться, когда ваше приложение запускается независимо от Activity.
Ответ 2
Вы можете попробовать зарегистрировать класс ParseUser перед вызовом Parse.initialize(), например:
ParseObject.registerSubclass(ParseUser.class);
Parse.initialize();
Я знаю, что вам не нужно это делать, но может быть проблемой для вашей проблемы.
Вы можете проверить и опубликовать результаты!
В противном случае вы всегда можете найти дополнительную информацию в команде анализа.
Ответ 3
Вы добавили эти две команды в свой манифест?:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Ответ 4
В моем проекте у меня были реальные проблемы с попыткой сделать метод signupinbackground работать по желанию, и, как я вижу, вам действительно не нужно, чтобы регистрация была сделана на заднем плане, так как вы даете немедленный ответ на Пользователь. Попробуйте сделать так:
try {
user.signUp();
Intent i = new Intent(Register.this, DeviceSettingsIntro.class);
startActivity(i);
progress.hide();
btnRegister.setEnabled(true);
} catch (ParseException e1) {
progress.hide();
checkParseError(e1);
btnRegister.setEnabled(true);
}