【问题标题】:RejectedExecutionException in Android StudioAndroid Studio 中的 RejectedExecutionException
【发布时间】:2016-09-05 07:12:59
【问题描述】:

我的应用(使用 HERE Android SDK)在进行模拟逐向导航时崩溃,异常日志如下,请告诉如何解决。

设备型号:SM-G9008V
SDK:5.0------------java.util.concurrent.RejectedExecutionException: 任务 android.os.AsyncTask$3@36d584c9 被拒绝 java.util.concurrent.ThreadPoolExecutor@23d4f7ce[运行,池大小= 9、活动线程 = 9、排队任务 = 128、已完成任务 = 828] java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011) java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793) java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339) android.os.AsyncTask.executeOnExecutor(AsyncTask.java:590) com.nokia.maps.bf.c(LocationRestHandler.java:207) com.nokia.maps.bf.b(LocationRestHandler.java:198) com.nokia.maps.dn.b(PlacesReverseGeocodeRequest.java:256) com.nokia.maps.dn.a(PlacesReverseGeocodeRequest.java:28) com.nokia.maps.dn$1.run(PlacesReverseGeocodeRequest.java:104) android.os.Handler.handleCallback(Handler.java:739) android.os.Handler.dispatchMessage(Handler.java:95) android.os.Looper.loop(Looper.java:145) android.app.ActivityThread.main(ActivityThread.java:5835) java.lang.reflect.Method.invoke(本机方法) java.lang.reflect.Method.invoke(Method.java:372) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

【问题讨论】:

标签: android sdk navigation here-api


【解决方案1】:

您是否同时发出许多请求?您似乎发出了太多请求,超出了未完成的最大数量:

java.util.concurrent.ThreadPoolExecutor@23d4f7ce[正在运行,池大小 = 9,活动线程 = 9,排队任务 = 128,已完成任务 = 828]

你在导航代码中做了什么?能发个sn-p吗?

【讨论】:

    【解决方案2】:

    为什么我会收到此错误消息?

    如果您超过了ThreadPoolExecutor 可以排队的任务数,您将收到此错误消息。唯一一次抛出 RejectedExecutionExceptionThreadPoolExecutor.AbortPolicy,这是默认的 RejectedExecutionHandler

    引用javadocs

    如果请求无法排队,则创建一个新线程,除非这 将超过 maximumPoolSize,在这种情况下,任务将 被拒绝。

    有最大数量的任务。在此处查看此问题/答案:Is there a limit of AsyncTasks to be executed at the same time?

    【讨论】:

      【解决方案3】:

      @David,下面是sn-p的代码:

      if(navigationManager == null) {
                  navigationManager = NavigationManager.getInstance();
                  navigationManager.setMap(map);
              }
      
              // start listening to navigation events
              instructListener = new InstructListener();
              navigationManager.addNewInstructionEventListener(
                      new WeakReference<NavigationManager.NewInstructionEventListener>(instructListener));
      
              // start listening to position events
              if (naviPositionListener == null) {
                  naviPositionListener = new NaviPositionListener();
              }
              navigationManager.addPositionListener(
                      new WeakReference<NavigationManager.PositionListener>(naviPositionListener));
      
              if (maneuverEventListener == null) {
                  maneuverEventListener = new ManeuverEventListener();
              }
              navigationManager.addManeuverEventListener(
                      new WeakReference<NavigationManager.ManeuverEventListener>(maneuverEventListener));
      
      
              if (myNavigationManagerEventListener == null) {
                  myNavigationManagerEventListener = new MyNavigationManagerEventListener();
              }
              navigationManager.addNavigationManagerEventListener(new WeakReference<NavigationManager.NavigationManagerEventListener>(myNavigationManagerEventListener));
      
              if (rerouteListener == null) {
                  rerouteListener = new MyRerouteListener();
              }
              navigationManager.addRerouteListener(new WeakReference<RerouteListener>(rerouteListener));
      
              if (safetySpotListener == null) {
                  safetySpotListener = new MySafetySpotListener();
              }
              navigationManager.addSafetySpotListener(new WeakReference<NavigationManager.SafetySpotListener>(safetySpotListener));
      
              //add realistic view listener
              navigationManager.setRealisticViewMode(NavigationManager.RealisticViewMode.DAY);
              navigationManager.addRealisticViewAspectRatio(NavigationManager.AspectRatio.AR_4x3);
      
              if (realisticViewListener == null) {
                  realisticViewListener = new MyRealisticViewListener();
              }
              navigationManager.addRealisticViewListener(
                      new WeakReference<NavigationManager.RealisticViewListener>(realisticViewListener));
      
      
              //set map udpate mode
              navigationManager.setMapUpdateMode(NavigationManager.MapUpdateMode.ROADVIEW);
              navigationManager.setTrafficAvoidanceMode(NavigationManager.TrafficAvoidanceMode.DISABLE);
      
              //set natural guidance mode
              EnumSet<NavigationManager.NaturalGuidanceMode> modeset = navigationManager.getNaturalGuidanceMode();
              modeset.add(NavigationManager.NaturalGuidanceMode.TRAFFIC_LIGHT);
              modeset.add(NavigationManager.NaturalGuidanceMode.STOP_SIGN);
              modeset.add(NavigationManager.NaturalGuidanceMode.JUNCTION);
      
              navigationManager.setNaturalGuidanceMode(modeset);
      
              // add gps signal listener
              if (gpsSignalListener == null) {
                  gpsSignalListener = new MyGpsSignalListener();
              }
              navigationManager.addGpsSignalListener(new WeakReference<NavigationManager.GpsSignalListener>(gpsSignalListener));
      
      
              if (speedWarningListener == null) {
                  speedWarningListener = new MySpeedWarningListener();
              }
              navigationManager.addSpeedWarningListener(new WeakReference<NavigationManager.SpeedWarningListener>(speedWarningListener));
      
              //add lane info listener
              if (laneInfoListener == null) {
                  laneInfoListener = new MyLaneInfoListener();
              }
              navigationManager.addLaneInfoListener(new WeakReference<NavigationManager.LaneInfoListener>(laneInfoListener));
      
      
              navigationManager.getRoadView().setOrientation(NavigationManager.RoadView.Orientation.DYNAMIC);
              navigationManager.getRoadView().addListener(new WeakReference<NavigationManager.RoadView.Listener>(roadViewListener));
      
      
              //start navigation
              long speed = 60; // meter per second
          navigationManager.simulate(mapRoute.getRoute(), speed);
      

      【讨论】:

      • 此代码未发出任何请求,因此不会导致问题。
      • @David,我不确定是哪种请求,你能举个例子吗?我们在导航期间所做的是添加导航侦听器并开始导航。
      • 地理编码,地点搜索将在内部用于异步任务。您是否以某种方式连续发出查找?或者,您的应用程序是否使用了许多异步任务?也许您的应用程序的 systrace 会显示异步任务线程在做什么?
      • 谢谢大卫,我们找到了这个问题,正如你所说,这是由于我们的代码中有太多不必要的地理编码搜索请求造成的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多