Android版的ScheduledThreadPoolExecutor原因:空 [英] Android ScheduledThreadPoolExecutor cause: null

查看:1154
本文介绍了Android版的ScheduledThreadPoolExecutor原因:空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我撕裂我的头发与这一个!我是一个新手到Android,所以我敢肯定,这东西超级明显。

我得到一个的ScheduledThreadPoolExecutor 例外,其中原因:空

我要的是运行每当活动是在屏幕上单独的线程!

  //实例变量
私人ScheduledExecutorService的m_oScheduledExecutor = NULL;@覆盖
保护无效onResume()
{
super.onResume();如果(oScheduledExecutor == NULL)
{
    oScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
}    尝试
    {
        oScheduledExecutor.scheduleAtFixedRate({Runnable的实例HERE},0,10,TimeUnit.SECONDS);
    }
    赶上(例外五)
    {
        的System.out.println((MainActivity)错误:+ e.getMessage()+原因:+ e.getCause());
    }
}@覆盖
保护无效的onStop()
{
    super.onStop();
    m_oScheduledExecutor.shutdown();
}

编辑:整个堆栈跟踪....

  java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@41976688从java.util.concurrent.ScheduledThreadPoolExecutor@4195c7f8拒绝[终止,池大小= 0 ,活动线程= 0,排队任务= 0,完成的任务= 1]
在java.util.concurrent.ThreadPoolExecutor中的$ AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1979)
在java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:786)
在java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:300)
在java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:545)
在java.util.concurrent.Executors$DelegatedScheduledExecutorService.scheduleAtFixedRate(Executors.java:619)
在com.example.wifitest.MainActivity.onResume(MainActivity.java:61)
在android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185)
在android.app.Activity.performResume(Activity.java:5182)
在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732)
在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1276)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:5041)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
在dalvik.system.NativeStart.main(本机方法)


解决方案

您不能'回收'的的ExecutorService 。一旦你调用关机(),试图安排任何任务会引起排斥反应,并在你的情况下,抑制政策是抛出 RejectedExecutionException

如果您按照您的堆栈跟踪,你可以在看的ScheduledThreadPoolExecutor

  / **
 *对于延迟任务ThreadPoolExecutor.execute的特殊的变种。
 * /
私人无效delayedExecute(Runnable的命令){
    如果(isShutdown()){
        拒绝(命令);
        返回;
    }
    // ...
}

保持你的遗嘱执行人服务作为实例变量是不会为你在这里工作:一旦它被关闭,不能再使用。

I'm tearing my hair out with this one! I'm a newbie to Android so I'm sure it's something super obvious.

I'm getting a ScheduledThreadPoolExecutor exception where cause: null

All I want is a seperate thread that runs whenever the activity is on screen!

// 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: Entire Stack Trace....

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)

解决方案

You cannot 'recycle' an ExecutorService. Once you have invoked shutdown(), attempting to schedule any task will cause a rejection, and in your case the rejection policy is to throw RejectedExecutionException.

If you follow your stacktrace, you can see in ScheduledThreadPoolExecutor:

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

Keeping your executor service as an instance variable is not going to work for you here: once it's been shutdown, it can't be used again.

这篇关于Android版的ScheduledThreadPoolExecutor原因:空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆