2016-03-02 2 views
-1

Я создал класс applicaion, теперь я делаю его экземпляр для использования в других классах, но я столкнулся с проблемой нулевого контекста.Ошибка класса приложения

Мой класс Применение:

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; 
    } 
} 

Обратите внимание, что в некоторых редких случаях (например, в контент-провайдера) может быть нулевым.

+0

если я использую объект таким образом .... будет ли какая-либо проблема, например, утечка памяти или любая проблема? –

+0

Объект приложения всегда является одноэлементом в вашем приложении (он просто недоступен никаким методом 'getInstance()', но доступен через 'context.getAppliactionContext()'). Таким образом, по умолчанию вы не создаете утечки памяти таким образом, но вы можете легко создать сценарий, в котором вы будете утечки памяти. Например. если вы создаете какое-то хранилище в приложении, вы должны быть осторожны, что вы там храните. – Tomik

+0

Хранение контекста, которое вы имеете в виду? –

Смежные вопросы