Reputation: 13
public class Checker {
static private int value1 = 0, value2 = 1;
static private Activity activity;
public static void init(Activity activity) {
Checker.activity = activity;
value1 = // calculate value
value2 = // calculate value, normally the same as value1
}
public static void check() {
if (value1 != value2)
activity.finish();
}
}
I got the above class and placed a call to Checker.init() in onCreate of the main activity and calls to Checker.check() at various points of my code. Problem is that I get a NullPointerException in Checker.check() for activity.finish() when re-opening the app after it has been backgrounded for some time.
Normally value1 == value2, so this exception seems to indicate that all the static variables were reset to default. I am a Java/Android newbie, but I thought these variables are retained as long as the activity is in memory and in case the activity is killed onCreate and so Checker.init() called again. So why does this happen?
Upvotes: 1
Views: 1044
Reputation: 11662
Based on the symptoms you are describing, what's most likely happening is that the ClassLoader for Checker is getting garbage collected but your Activity is not being garbage collected. So when the app returns from the background, Activity goes to onResume
. When the call to Checker.check()
is made, the Checker
class is reloaded with the default values of value1
and value2
.
One way to make sure that the Checker class stays around as long as the Activity is to keep a reference to a Checker instance in the Activity class. Of course, you might also consider redesigning the Checker functionality so that it doesn't depend on static member behavior.
Upvotes: 2
Reputation: 1243
This is most likely caused by the activity not existing any more. If its in the background the os might kill it and restart it when needed, so you will need to check if it is != null before you try and finish() it :)
if (value1 != value2 && activity != null) activity.finish();
Upvotes: 0