Вызывается: java.lang.IllegalStateException: ParsePlugins уже инициализирован
Я ухожу из приложения, перезапускаю его, получаю исключение.
public void onCreate() {
-->here Parse.initialize(this, "adfsfasdfs",
"asdfadfsdf");
ParseInstallation.getCurrentInstallation().saveInBackground();
ParseInstallation.create(identity == null ? "No Identity Set"
: identity);
Исключение
07-08 23:27:29.411: E/AndroidRuntime(4889): Caused by: java.lang.IllegalStateException: ParsePlugins is already initialized
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.ParsePlugins.set(ParsePlugins.java:27)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.ParsePlugins.access$200(ParsePlugins.java:11)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.ParsePlugins$Android.initialize(ParsePlugins.java:141)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.Parse.initialize(Parse.java:178)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.mcruiseon.caregiri.Registration.onCreate(Registration.java:98)
Файл манифеста
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="com.parse.ParsePushBroadcastReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
Изменить:
Интересно, почему Parse выбрал для этого исключение. Почему не просто info
и двигаться дальше. Его инициализированная, такая большая сделка, если я снова ее инициализирую.
Решение
Я отказался от Парса. Не нравится способ применения, просто раздражать, чтобы поддерживать.
Ответы
Ответ 1
Parse.initialize()
следует называть только один раз для всего приложения.
Вызов его в функции Activity
onCreate
может привести к его инициализации более одного раза, поскольку активность может быть создана несколько раз во время жизненного цикла приложения.
Вместо этого создайте класс Application (и добавьте атрибут android:name
в свой манифест приложения).
Приложение: (Обратите внимание, что это не мероприятие/служба/приемник)
//Note that this is an android.app.Application class.
public class MyApplication extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
//This will only be called once in your app entire lifecycle.
Parse.initialize(this,
getResources().getString(R.string.parse_application_id),
getResources().getString(R.string.parse_client_key));
}
AndroidManifest:
<application
android:name=".MyApplication">
....
<activity>
....
</activity>
</application>
Ответ 2
NEVERMIND, я исправил его. Проблема была вызвана синтаксической ошибкой. Спасибо всем за решение.
Это странно, поскольку я следил за тем, что было дано, но теперь я не получаю никаких push-уведомлений вообще? Единственные изменения, которые я сделал:
- добавить класс приложения в манифест и
- инициализировать синтаксический анализ в классе приложения. Я использую v1.10.1 SDK...
манифеста
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="full.package.name.UseParse" >
Класс приложения
public class UseParse extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
Parse.initialize(this, "id", "key");
ParseInstallation.getCurrentInstallation().saveInBackground();
}
Ответ 3
Проверьте инициализацию самостоятельно и просто обработайте исключение, и ошибка не приведет к сбою приложения, просто тихо выбросив исключение.
try {
Parse.initialize(this);
parseinited = true;
}
catch (IllegalStateException e) {
e.printStackTrace();
}
Ответ 4
Я решил его использовать логическую переменную isParseInitialized. Работы по изменению ориентации, т.е. когда активность воссоздана в том же сеансе приложения. Фрагмент кода:
public class YourActivity extends Activity {
private static boolean isParseInitialized = false;
public static final String APPLICATION_ID = "your_application_id";
public static final String CLIENT_KEY = "your_client_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_youractivity);
if(isParseInitialized==false) {
Parse.initialize(this, APPLICATION_ID, CLIENT_KEY);
isParseInitialized = true;
}
..........
}
Ответ 5
это решение
public class MainActivity extends AppCompatActivity {
static boolean parseIsInit = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!parseIsInit){
Log.d("demo",""+parseIsInit );
Parse.initialize(this, "PutHereYourKeys", "PutHereYourKeys");
parseIsInit=true;
}
ParseInstallation.getCurrentInstallation().saveInBackground();
}
}