2013-10-02 2 views
3

Я срываю свои волосы с помощью этого! Я новичок на Android, поэтому я уверен, что это нечто совершенно очевидное.Android ScheduledThreadPoolExecutor cause: null

Я получаю ScheduledThreadPoolExecutor исключение, где cause: null

Все, что я хочу, это отдельная нить, которая проходит каждый раз, когда активность на экране!

// Instance Variables 
private ScheduledExecutorService m_oScheduledExecutor = null; 

@Override 
protected void onResume() 
{ 
super.onResume(); 

if (oScheduledExecutor == null) 
{ 
    oScheduledExecutor = Executors.newSingleThreadScheduledExecutor(); 
} 

    try 
    { 
     oScheduledExecutor.scheduleAtFixedRate({Runnable Instance HERE}, 0, 10, TimeUnit.SECONDS); 
    } 
    catch (Exception e) 
    { 
     System.out.println("(MainActivity) Error: " + e.getMessage() + " Cause: " + e.getCause()); 
    } 
} 

@Override 
protected void onStop() 
{ 
    super.onStop(); 
    m_oScheduledExecutor.shutdown(); 
} 

EDIT: Весь Трассировка стека ....

java.util.concurrent.RejectedExecutionException: Task java.[email protected]41976688 rejected from [email protected][Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1] 
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1979) 
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:786) 
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:300) 
at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:545) 
at java.util.concurrent.Executors$DelegatedScheduledExecutorService.scheduleAtFixedRate(Executors.java:619) 
at com.example.wifitest.MainActivity.onResume(MainActivity.java:61) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185) 
at android.app.Activity.performResume(Activity.java:5182) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1276) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5041) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 
+0

Пожалуйста, разместите всю трассировку стека. – CommonsWare

ответ

8

Вы не можете 'рецикл' ExecutorService. После того, как вы вызвали shutdown(), попытка запланировать любую задачу вызовет отклонение, и в вашем случае политика отклонения будет выбрасывать RejectedExecutionException.

Если следовать вашей StackTrace, вы можете увидеть в ScheduledThreadPoolExecutor:

/** 
* Specialized variant of ThreadPoolExecutor.execute for delayed tasks. 
*/ 
private void delayedExecute(Runnable command) { 
    if (isShutdown()) { 
     reject(command); 
     return; 
    } 
    // ... 
} 

Поддержание вашей службы ИСПОЛНИТЕЛЬ как переменную экземпляра не будет работать для вас здесь: как только это было отключение, оно не может быть снова используется.

0

Не закрывайте службу ScheduledExecutorService внутри метода onStop(). Попробуйте поместить его внутри метода onDestroy(). Когда ваша деятельность идет в фоновом режиме, метод onStop() может быть вызван, так как ваша активность не отображается в фоновом режиме. Из-за этого, если ScheduledExecutorService выключается, вы можете получить эту ошибку.

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