2017-08-11 10 views
0

Googleデベロッパーコンソールで、同じレーンに2つの異なるデバイス(P10 (HWVTR)-Android 7.0LG G3 (g3) - Android 6.0)でアプリがjava.lang.ClassCastExceptionエラーが発生しています。私は何が問題なのかわからない、私はSamsung Galaxy A3 2014 & 2017 and Huawei P9 Liteでそれをテストし、素晴らしい作品です。一部の端末でjava.lang.ClassCastExceptionが発生しました

SharedPreferences prefs = this.getSharedPreferences(
      "toast", Context.MODE_PRIVATE); 

    final int hasVisited = prefs.getInt("HAS_VISISTED_BEFORE", 0); 

    if(hasVisited == 0) { 
     AlertDialog.Builder builder; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert); 
     } else { 
      builder = new AlertDialog.Builder(this); 
     } 
     builder.setTitle("My Text") 
       .setMessage("My Text, dsajh jghjsahjhsda dsa dsa") 
       .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         // do nothing 
        } 
       }) 
       .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         // do nothing 
        } 
       }) 
       .setIcon(android.R.drawable.ic_dialog_info) 
       .show(); 
     prefs.edit().putInt("HAS_VISISTED_BEFORE", 1).apply(); 
    } 

エラーがここにfinal int hasVisited = prefs.getInt("HAS_VISISTED_BEFORE", 0);

私はアプリがあれば最初に実行したときに一度だけこのAlertDialogを表示したいです:ここでは

はコードです。

エラーログ:

Caused by: java.lang.ClassCastException: 
    at android.app.SharedPreferencesImpl.getInt (SharedPreferencesImpl.java:242) 
    at com.doggedness_dev.pubgcratessimulator.MenuActivity.onCreate (MenuActivity.java:40) 
    at android.app.Activity.performCreate (Activity.java:6272) 
    at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2387) 

キーHAS_VISISTED_BEFOREと私のSharedPreferencesは、同じキーを持つ別のアプリに干渉することは可能でしょうか?

+1

() 'prefs.edit()putInt( "HAS_VISISTED_BEFORE"、1).commit()(コミットしてみてください)の代わりに適用されます。' 'コミットので()は'スレッドをブロック(同期してデータを書き込み、その由来から)。その後、操作の成功を通知します。 'apply()'は、非同期で書き込まれるデータをスケジュールします。操作の成功を通知するものではありません。 –

+0

私は変更します、ありがとう! –

答えて

2

すべてのアプリケーションには独自の共有設定があり、同じキーを持つ別のアプリケーションと干渉する方法はありません。

アプリケーションの古いバージョンがHAS_VISISTED_BEFOREと同じキーを持ち、その値が整数でない場合、この問題が発生します。あなたはすでにこのキーの値を持っているので、タイプはまったく違っています。

この例外については、以下のようにtry-catchを使用できます。

try { 

}catch (ClassCastException ex){ 
    ex.printStackTrace(); 
} 
+0

あなたは正しいです!私の古いバージョンでは、アプリケーションが初めて実行されているかどうかを判断するために 'SharedPreferences'をブール値' false and true'で使用しました。最新バージョンでのみ整数に変更しました。どうもありがとう!! –

+1

@MoisoniIonutよろしくお願いします。または、新しいバージョンのキー「HAS_VISISTED_BEFORE」を変更することもできます。 –

0

削除この:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert); 
    } else { 
     builder = new AlertDialog.Builder(this); 
    } 

と線の下に書きます。

builder = new AlertDialog.Builder(MainActivity.this); 
関連する問題