Java 应用程序空闲时的Android异常
我有一个异常是在应用程序闲置一段时间后引发的。这似乎总是发生在我的应用程序试图引用我的singleton typeface类时 我的singleton类(TypefaceSingleton.java)用于引用来自单个源的Roboto字体。这是实际文件的缩小版本。我已经标记了堆栈跟踪中的行Java 应用程序空闲时的Android异常,java,android,android-activity,Java,Android,Android Activity,我有一个异常是在应用程序闲置一段时间后引发的。这似乎总是发生在我的应用程序试图引用我的singleton typeface类时 我的singleton类(TypefaceSingleton.java)用于引用来自单个源的Roboto字体。这是实际文件的缩小版本。我已经标记了堆栈跟踪中的行 TypefaceSingleton.java类 我只初始化singleton类一次。我有一个splashscreen活动来执行初始化 SplashScreenActivity.java 引发的异常指示对Ty
TypefaceSingleton.java类 我只初始化singleton类一次。我有一个splashscreen活动来执行初始化
SplashScreenActivity.java 引发的异常指示对TypefaceSingleton.GetRobotoCondencedBoldItalic的空指针引用
从开发者控制台 我确信java必须解决的问题是处理内存(即垃圾收集?),但我不确定如何解决 提前谢谢
Steve因为它在系统资源获取期间被置空。每次应用程序出现在前台时,您都必须重新实例化您的类(即:重新创建最后一个活动);然后调用与您的问题无关的singleton.initialize():将其设置为
getInstance(Context)
和mContext=Context.getApplicationContext()
,这样客户端代码就不会错误地使用该类。您当前要求客户机代码以非常特定的方式和顺序使用该类。@DerGolem-我误解了Singleton类和内存管理。因为我实例化过一次,所以我希望它在内存中。我部分地认为这是因为我的应用程序在应用程序历史记录中仍然可用(例如,按下Home按钮并查看我的应用程序),我的singleton类仍然存在。我想另一种方法是将字体初始化调用放入基类中,并让我的活动从基类继承。当你的应用进入后台时,Android开始回收资源。就像一个税务代理人。没有怜悯。所以,你必须在每次活动复活时重新初始化所有的类(不仅仅是-甚至是图像、声音等等!)。
package com.steve.demo;
import android.content.Context;
import android.graphics.Typeface;
import android.view.View;
public class TypefaceSingleton {
private static Context mContext;
public static void initialize(Context context) {
mContext = context;
}
private static Typeface robotoCondensedBoldItalic;
public static Typeface getRobotoCondensedBoldItalic() {
if (robotoCondensedBoldItalic == null) {
// (TypefaceSingleton.java:111) is below
robotoCondensedBoldItalic = Typeface.createFromAsset(mContext.getAssets(), "fonts/Roboto/RobotoCondensed-BoldItalic.ttf");
}
return robotoCondensedBoldItalic;
}
private static TypefaceSingleton mInstance;
public static TypefaceSingleton getInstance() {
if (mContext == null) {
throw new IllegalArgumentException("This class must be initialized before");
}
if (mInstance == null) {
mInstance = new TypefaceSingleton();
}
return mInstance;
}
private TypefaceSingleton() {
// Todo here
}
}
// Perform Initialization
TypefaceSingleton.initialize(mContext.getApplicationContext());
TypefaceSingleton.getInstance();
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.steve.demo/com.steve.demo.RoutesActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2334)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
at android.app.ActivityThread.access$900(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5487)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.steve.demo.TypefaceSingleton.getRobotoCondensedBoldItalic(TypefaceSingleton.java:111)
at com.steve.demo.RoutesActivity.setCustomActionBarTitle(RoutesActivity.java:130)
at com.steve.demo.RoutesActivity.onCreate(RoutesActivity.java:86)
at android.app.Activity.performCreate(Activity.java:5451)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
... 11 more