2014-11-22 149 views
0

我正在创建一个Android应用程序,并希望在Application类中存储一个变量。该变量表示哪个活动当前处于焦点状态。应用程序类空指针异常

我的目标是在onResume()中设置这个变量并将其重置为onPause()。这两种方法都被称为应用程序初始化。每当我运行我的代码时,该软件就会在空指针溢出的基础上崩溃,并尝试修改Application类中的变量。据我所知,即使我已经测试了代码并知道它称为应用程序类'onCreate(),但在我看来,应用程序类似于null

我正确地认为它连接到应用程序类未完全创建?或者它与我的所有实例有关?我对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()返回的引用初始化之前,因此保持为空。

而不是使用它,用局部变量替换每个访问app

例如:

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

合理的逻辑,这正是问题是,谢谢!这是我将来在使用该课程时需要注意的事项。 – clb9355 2014-11-22 04:47:10