2016-03-02 98 views
-1

我创建了一个应用程序类,现在我正在使其实例在其他类中使用,但我面临上下文空问题。应用程序类错误

我的应用程序类别:

public class CommonForApp extends Application { 
private static CommonForApp sInstance; 
private Utilities mUtilities = null; 
private static SharedPreferences mSharedPreferences; 

@Override 
    public void onCreate() { 
     super.onCreate(); 
     mSharedPreferences = this.getSharedPreferences(
       "com.myandroidapp.musicplayer", Context.MODE_PRIVATE); 
     mContext=this.getApplicationContext(); 
     mUtilities = new Utilities(); 
    } 

    public CommonForApp() { 
    } 
    public static CommonForApp getInstance() { 
     if (sInstance == null) 
      sInstance = new CommonForApp(); 

     return sInstance; 
    } 

} 

而且在AndroidManifest.xml宣布它是这样的:

<application 
     android:name="com.android.musicplayer.datastorageandarraylistsaccesser.CommonForApp" 
     android:largeHeap="true" 
android:icon="@drawable/ic_launcher" 
     android:label="Music" android:allowBackup="true"> 

我现在用它在其他类这样的:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     mApp=CommonForApp.getInstance(); 
     final List<GlobalSongDetails> s=mApp.getGlobalSongsList(); 

} 

我收到以下错误:

03-02 18:50:41.167: E/AndroidRuntime(16177): FATAL EXCEPTION: main 
03-02 18:50:41.167: E/AndroidRuntime(16177): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.musicplayer/com.android.musicplayer.Fragmentactivity}: java.lang.NullPointerException 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.ActivityThread.access$600(ActivityThread.java:156) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.os.Looper.loop(Looper.java:153) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.ActivityThread.main(ActivityThread.java:5297) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at java.lang.reflect.Method.invokeNative(Native Method) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at java.lang.reflect.Method.invoke(Method.java:511) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at dalvik.system.NativeStart.main(Native Method) 
03-02 18:50:41.167: E/AndroidRuntime(16177): Caused by: java.lang.NullPointerException 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at com.android.musicplayer.datastorageandarraylistsaccesser.CommonForApp.makeGlobalSongsList(CommonForApp.java:127) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at com.android.musicplayer.datastorageandarraylistsaccesser.CommonForApp.getGlobalSongsList(CommonForApp.java:164) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at com.android.musicplayer.Fragmentactivity.onCreate(Fragmentactivity.java:156) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.Activity.performCreate(Activity.java:5122) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081) 
03-02 18:50:41.167: E/AndroidRuntime(16177): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270) 
03-02 18:50:41.167: E/AndroidRuntime(16177): ... 11 more 

但是,如果我做这样的实例:

mApp=(CommonForApp) this.getApplicationContext(); 

我没有得到任何错误。

任何人都可以解释我在做什么错误?

谢谢,提前!

回答

1

问题是在getInstance()中使用new手动创建应用程序对象的实例。你不能那样做。 只有系统实例化应用程序对象。

如果你想与你必须使用这种方式的应用程序的单工作:

public class CommonForApp extends Application { 

    private static CommonForApp sInstance; 
    … 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     sInstance = this; 
     … 
    } 

    public static CommonForApp getInstance() { 
     return sInstance; 
    } 
} 

注意,在某些罕见的情况下(例如,在内容提供商),它可以为null。

+0

如果我以这种方式使用对象....会有任何问题,如内存泄漏或任何种类的问题? –

+0

应用程序对象在您的应用程序中始终是单例(它只是无法通过任何'getInstance()'方法访问,但它可以通过'context.getAppliactionContext()')访问。因此,默认情况下,您不会以这种方式创建任何内存泄漏,但您可以轻松创建泄漏内存的场景。例如。如果你在应用程序中创建了一些存储空间,那么你必须小心你在那里存储的东西。 – Tomik

+0

上下文的存储意味着什么? –