27
27
28
28
package com .onesignal ;
29
29
30
- import java .io .PrintWriter ;
31
- import java .io .StringWriter ;
32
- import java .util .ArrayList ;
33
- import java .util .Calendar ;
34
- import java .util .Collection ;
35
- import java .util .Date ;
36
- import java .util .HashMap ;
37
- import java .util .HashSet ;
38
- import java .util .Iterator ;
39
- import java .util .Map ;
40
- import java .util .TimeZone ;
41
- import java .util .concurrent .ConcurrentLinkedQueue ;
42
- import java .util .concurrent .ExecutorService ;
43
- import java .util .concurrent .Executors ;
44
- import java .util .concurrent .ThreadFactory ;
45
- import java .util .concurrent .atomic .AtomicLong ;
46
-
47
30
import android .app .Activity ;
48
31
import android .app .AlertDialog ;
49
32
import android .app .Application ;
68
51
import org .json .JSONException ;
69
52
import org .json .JSONObject ;
70
53
54
+ import java .io .PrintWriter ;
55
+ import java .io .StringWriter ;
56
+ import java .util .ArrayList ;
57
+ import java .util .Calendar ;
58
+ import java .util .Collection ;
59
+ import java .util .Date ;
60
+ import java .util .HashMap ;
61
+ import java .util .HashSet ;
62
+ import java .util .Iterator ;
63
+ import java .util .Map ;
64
+ import java .util .TimeZone ;
65
+ import java .util .concurrent .ConcurrentLinkedQueue ;
66
+ import java .util .concurrent .ExecutorService ;
67
+ import java .util .concurrent .Executors ;
68
+ import java .util .concurrent .RejectedExecutionException ;
69
+ import java .util .concurrent .ThreadFactory ;
70
+ import java .util .concurrent .atomic .AtomicLong ;
71
+
71
72
/**
72
73
* The main OneSignal class - this is where you will interface with the OneSignal SDK
73
74
* <br/><br/>
@@ -847,7 +848,7 @@ public void run() {
847
848
}
848
849
849
850
private static void startPendingTasks () {
850
- if (!taskQueueWaitingForInit .isEmpty ()) {
851
+ if (!taskQueueWaitingForInit .isEmpty ()) {
851
852
pendingTaskExecutor = Executors .newSingleThreadExecutor (new ThreadFactory () {
852
853
@ Override
853
854
public Thread newThread (@ NonNull Runnable runnable ) {
@@ -857,7 +858,7 @@ public Thread newThread(@NonNull Runnable runnable) {
857
858
}
858
859
});
859
860
860
- while (!taskQueueWaitingForInit .isEmpty ()) {
861
+ while (!taskQueueWaitingForInit .isEmpty ()) {
861
862
pendingTaskExecutor .submit (taskQueueWaitingForInit .poll ());
862
863
}
863
864
}
@@ -866,29 +867,39 @@ public Thread newThread(@NonNull Runnable runnable) {
866
867
private static void addTaskToQueue (PendingTaskRunnable task ) {
867
868
task .taskId = lastTaskId .incrementAndGet ();
868
869
869
- if (pendingTaskExecutor == null ) {
870
+ if (pendingTaskExecutor == null ) {
870
871
OneSignal .Log (LOG_LEVEL .INFO ,"Adding a task to the pending queue with ID: " + task .taskId );
871
872
//the tasks haven't been executed yet...add them to the waiting queue
872
873
taskQueueWaitingForInit .add (task );
873
874
}
874
- else if (!pendingTaskExecutor .isShutdown ()) {
875
+ else if (!pendingTaskExecutor .isShutdown ()) {
875
876
OneSignal .Log (LOG_LEVEL .INFO ,"Executor is still running, add to the executor with ID: " + task .taskId );
876
- //if the executor isn't done with tasks, submit the task to the executor
877
- pendingTaskExecutor .submit (task );
877
+ try {
878
+ //if the executor isn't done with tasks, submit the task to the executor
879
+ pendingTaskExecutor .submit (task );
880
+ } catch (RejectedExecutionException e ) {
881
+ OneSignal .Log (LOG_LEVEL .INFO ,"Executor is shutdown, running task manually with ID: " + task .taskId );
882
+ // Run task manually when RejectedExecutionException occurs due to the ThreadPoolExecutor.AbortPolicy
883
+ // The pendingTaskExecutor is already shutdown by the time it tries to run the task
884
+ // Issue #669
885
+ // https://github.com/OneSignal/OneSignal-Android-SDK/issues/669
886
+ task .run ();
887
+ e .printStackTrace ();
888
+ }
878
889
}
879
890
880
891
}
881
892
882
893
private static boolean shouldRunTaskThroughQueue () {
883
- if (initDone && pendingTaskExecutor == null ) // there never were any waiting tasks
894
+ if (initDone && pendingTaskExecutor == null ) // there never were any waiting tasks
884
895
return false ;
885
896
886
897
//if init isn't finished and the pending executor hasn't been defined yet...
887
- if (!initDone && pendingTaskExecutor == null )
898
+ if (!initDone && pendingTaskExecutor == null )
888
899
return true ;
889
900
890
901
//or if the pending executor is alive and hasn't been shutdown yet...
891
- if (pendingTaskExecutor != null && !pendingTaskExecutor .isShutdown ())
902
+ if (pendingTaskExecutor != null && !pendingTaskExecutor .isShutdown ())
892
903
return true ;
893
904
894
905
return false ;
0 commit comments