2014-11-22 5 views
0

Я создаю приложение для Android и хочу сохранить переменную в классе Application. Переменная означает, какая активность в данный момент находится в фокусе.Класс приложения Null Pointer Exception

Я хочу установить эту переменную в onResume() и сбросить ее в onPause(). Оба метода называются как инициализация приложения. Сбой программного обеспечения на основе Null Pointer Excepetion всякий раз, когда я запускаю свой код, в строках, где я пытаюсь изменить переменную в классе Application. Насколько мне известно, мне кажется, что класс приложения null, хотя я проверил код и знаю, что он вызывает класс приложения 'onCreate().

Правильно ли я предполагаю, что он подключен к классу приложений, который не был полностью создан? Или это связано с моим созданием всего этого? Я достаточно новичок в Android и до сих пор не занимался классом Application - насколько я вижу, я правильно следил за руководствами и учебниками. Я надеюсь, что это простая ошибка.

Любые советы приветствуются!

MainActivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { 

    //[... other initialisations...] 

    // Tells software what window is in focus. 
    // Reference to Application class 
    private MyApplicationClass app = (MyApplicationClass)getApplication(); 
    private static final int outOfFocus = 0; 
    private static final int inFocus = 1; 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     //[... other code...] 
     app.setActivityFocusIndicator(inFocus); //Crashes here 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     //[... other code...] 
     app.setActivityFocusIndicator(outOfFocus); //Crashes here 
    } 
} 

MyApplicationClass.java

public class MyApplicationClass extends Application { 

    private int activityFocusIndicator; 
    /* activityFocusIndicator is here to indicate which activity is in focus. 
    * 0 = Nothing in focus (written when pausing.) 
    * 1 = MainActivity 
    * 2 = ... 
    * ... 
    */ 

    public void setActivityFocusIndicator(int activityFocusIndicator) { 
     this.activityFocusIndicator = activityFocusIndicator; 
    } 

    public int getActivityFocusIndicator() { 
     return activityFocusIndicator; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d("App", "App was created."); // This line is reached. 
    } 
} 

файл манифеста

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.someApp" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-feature android:name="android.hardware.bluetooth_le" 
        android:required="true"/> 

    <uses-sdk 
     android:minSdkVersion="18" 
     android:targetSdkVersion="19" /> 

    <uses-permission android:name="android.permission.BLUETOOTH"/> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/TabTheme" 
     android:name="com.example.someName.MyApplicationClass" > 
     <activity 
      android:name="com.example.someName.MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:launchMode="singleInstance" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      ... 
     </activity> 
     <!-- ... [other activities declared]... --> 
     <service 
      android:name=".BluetoothService"/> 
    </application> 
</manifest> 

Я могу отправить LogCat если попросят.

ответ

0

Я не вижу смысла в этой линии:

private MyApplicationClass app = (MyApplicationClass)getApplication(); 

Эта переменная, вероятно, инициализируется перед ссылка, возвращенная getApplication() инициализирован, и поэтому остается пустым.

Вместо того чтобы использовать его, замените каждый acess на app на локальную переменную.

Например:

protected void onResume() { 
    super.onResume(); 
    //[... other code...] 
    MyApplicationClass app = (MyApplicationClass)getApplication(); 
    app.setActivityFocusIndicator(inFocus); 
} 
+0

Sound логика, это именно то, что этот вопрос, спасибо! Это то, что мне нужно будет иметь в виду при использовании этого класса в будущем. – clb9355