web-dev-qa-db-ja.com

原因: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だけで先に進んでみませんか。初期化されているので、もう一度初期化すると大したことです。

解決策

私はParseをあきらめました。アプリケーションの方法は好きではありません。維持するのが面倒です。

12
Siddharth

Parse.initialize()は、アプリケーション全体で1回だけ呼び出す必要があります

ActivityonCreate関数で呼び出すと、アプリのライフサイクル中にアクティビティが複数回作成される可能性があるため、複数回初期化される可能性があります

代わりに、アプリケーションクラスを作成します(そして、アプリケーションのマニフェストに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's 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>
28
Khalos

決して気にしないで、私はそれを修正しました。問題は構文エラーが原因でした。解決のためにすべてに感謝します。

私は与えられたものに従ったのでこれは奇妙ですが、今はプッシュ通知をまったく受け取っていませんか?私が行った唯一の変更:

  1. マニフェストにアプリクラスを追加&
  2. アプリクラスで解析を初期化します。 SDKのv1.10.1を使用しています...

マニフェスト

<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();
}
4
JC23

自分で初期化を確認し、例外を処理するだけで、エラーによってアプリがクラッシュすることはなく、静かに例外がスローされます。

        try {
            Parse.initialize(this);
            parseinited = true;
        }
        catch (IllegalStateException e) {
            e.printStackTrace();
        }
2
pseudozach

ブール値を使用して解決しました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;
    }

  ..........

}
1
charany1

これは解決策です

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();

    }
}
0
user196554