Browse Source

Fix NPE when I2PDActivity got garbage collected and i2pdDaemon became null

pull/44/head
nonlin-lin-chaos-order-etc-etal 2 years ago
parent
commit
9517bfc208
  1. 14
      app/src/main/java/org/purplei2p/i2pd/I2PDActivity.java
  2. 11
      app/src/main/java/org/purplei2p/i2pd/MyJobService.java
  3. 1
      app/src/main/java/org/purplei2p/i2pd/receivers/MakeMeAJobReceiver.java

14
app/src/main/java/org/purplei2p/i2pd/I2PDActivity.java

@ -46,9 +46,6 @@ public class I2PDActivity extends Activity { @@ -46,9 +46,6 @@ public class I2PDActivity extends Activity {
public static final int GRACEFUL_DELAY_MILLIS = 10 * 60 * 1000;
public static final String PACKAGE_URI_SCHEME = "package:";
private final MakeMeAJobReceiver jobReceiver = isJobServiceApiAvailable() ?
new MakeMeAJobReceiver() : null;
private TextView textView;
private CheckBox HTTPProxyState;
private CheckBox SOCKSProxyState;
@ -56,6 +53,9 @@ public class I2PDActivity extends Activity { @@ -56,6 +53,9 @@ public class I2PDActivity extends Activity {
private CheckBox SAMState;
private CheckBox I2CPState;
private final MakeMeAJobReceiver jobReceiver = isJobServiceApiAvailable() ?
new MakeMeAJobReceiver() : null;
private static volatile DaemonWrapper daemon;
public static DaemonWrapper getDaemon() { return daemon; }
@ -144,11 +144,16 @@ public class I2PDActivity extends Activity { @@ -144,11 +144,16 @@ public class I2PDActivity extends Activity {
filter.addAction(MakeMeAJobReceiver.MAKEMEAJOB_ACTION);
registerReceiver(jobReceiver, filter);
final DaemonWrapper daemon = I2PDActivity.daemon;
if (daemon==null) throw new NullPointerException("daemon is null before the job pinger init");
new Thread(() -> {
try {
while (getDaemon().getState().needsToBeAlive()) {
// if (daemon==null) throw new NullPointerException("daemon is null at the job pinger init");
while (daemon.getState().needsToBeAlive()) {
runOnUiThread(() -> {
try {
I2PDActivity.daemon = daemon;
sendBroadcast(new Intent(MakeMeAJobReceiver.MAKEMEAJOB_ACTION));
} catch (Throwable tr) {
Log.e(TAG, "", tr);
@ -276,6 +281,7 @@ public class I2PDActivity extends Activity { @@ -276,6 +281,7 @@ public class I2PDActivity extends Activity {
synchronized (I2PDActivity.class) {
if (!jobServiceBound && org.purplei2p.i2pd.I2PDActivity.isJobServiceApiAvailable()) {
bindService(new Intent(this, MyJobService.class), jobServiceConnection, Context.BIND_AUTO_CREATE);
MyJobService.setI2PDDaemon(daemon);
jobServiceBound = true;
}
}

11
app/src/main/java/org/purplei2p/i2pd/MyJobService.java

@ -13,6 +13,12 @@ public class MyJobService extends JobService { @@ -13,6 +13,12 @@ public class MyJobService extends JobService {
private DaemonWrapper.StateUpdateListener listener;
public static DaemonWrapper getI2PDDaemon() {
DaemonWrapper daemon = I2PDActivity.getDaemon();
if (daemon==null) throw new NullPointerException("i2pdDaemon==null");
return daemon;
}
@Override
public boolean onStartJob(final JobParameters params) {
Log.d(TAG,"onStartJob entered");
@ -26,7 +32,8 @@ public class MyJobService extends JobService { @@ -26,7 +32,8 @@ public class MyJobService extends JobService {
jobFinished(params, false);
}
};
I2PDActivity.getDaemon().addStateChangeListener(listener);
getI2PDDaemon().addStateChangeListener(listener);
/*
"So, the system may kill the process at any time to reclaim memory, and in doing so,
@ -58,6 +65,6 @@ public class MyJobService extends JobService { @@ -58,6 +65,6 @@ public class MyJobService extends JobService {
}
private void removeDaemonStateChangeListener() {
I2PDActivity.getDaemon().removeStateChangeListener(listener);
getI2PDDaemon().removeStateChangeListener(listener);
}
}

1
app/src/main/java/org/purplei2p/i2pd/receivers/MakeMeAJobReceiver.java

@ -8,6 +8,7 @@ import android.content.Context; @@ -8,6 +8,7 @@ import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.purplei2p.i2pd.DaemonWrapper;
import org.purplei2p.i2pd.I2PDActivity;
import org.purplei2p.i2pd.MyJobService;

Loading…
Cancel
Save