Вызывается: 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();

    }
}