4

私はこれで髪を引き裂いています!私はAndroidの初心者なので、それは非常に明白なことだと確信しています。

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();
}

編集:スタックトレース全体....

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@41976688 rejected from java.util.concurrent.ScheduledThreadPoolExecutor@4195c7f8[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)
4

2 に答える 2

8

を「リサイクル」することはできませんExecutorService。を呼び出すshutdown()と、タスクをスケジュールしようとすると拒否されます。この場合、拒否ポリシーは をスローすることRejectedExecutionExceptionです。

スタックトレースをたどると、次のように表示されScheduledThreadPoolExecutorます。

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

エグゼキュータ サービスをインスタンス変数として保持することは、ここではうまくいきません。いったんシャットダウンすると、再び使用することはできません。

于 2013-10-02T18:17:37.533 に答える
-1

onStop() メソッド内で ScheduledExecutorService をシャットダウンしないでください。onDestroy() メソッド内に配置してみてください。アクティビティがバックグラウンドになると、アクティビティがバックグラウンドで表示されないため、onStop() メソッドが呼び出される可能性があります。このため、ScheduledExecutorService がシャットダウンされている場合、このエラーが発生する可能性があります。

于 2013-10-02T18:21:01.467 に答える