0

My app (using HERE Android SDK) crashes while doing the simulated turn-by-turn navigation, the exception log is as below, please tell how to resolve it.

device model:SM-G9008V
SDK:5.0-----------java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@36d584c9 rejected from java.util.concurrent.ThreadPoolExecutor@23d4f7ce[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 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(Native Method) 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)

Steven Hu
  • 5
  • 2

3 Answers3

2

Are you issuing many requests concurrently? It seems you have issued too many requests and exceeded the maximum number outstanding:

java.util.concurrent.ThreadPoolExecutor@23d4f7ce[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 828]

What are you doing in the navigation code? Can you post a snippet?

David Leong
  • 1,662
  • 1
  • 11
  • 7
1

Why would I be getting this error message?

You would get this error message if you have exceeded the number of tasks that can be queued by the ThreadPoolExecutor. The only time the RejectedExecutionException is thrown is by the ThreadPoolExecutor.AbortPolicy which is the default RejectedExecutionHandler.

To quote from the javadocs:

If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.

There is a maximum number of tasks. See this question/answer here: Is there a limit of AsyncTasks to be executed at the same time?

Community
  • 1
  • 1
0

@David, below is the code snippet:

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);
Steven Hu
  • 5
  • 2
  • This code isn't issuing any requests, so it cannot be contributing to the problem. – David Leong May 24 '16 at 21:22
  • @David, I'm not sure which kind of request, can you please provide a example? What we have done during navigation are adding navigation listeners and start navigation. – Steven Hu May 26 '16 at 06:53
  • Geocoding, place search would internally have uses for async tasks. Are you somehow issuing lookups continuously? Or alternatively, does your app use many async tasks? Perhaps a systrace of your application will show what the async task threads are doing? – David Leong May 27 '16 at 14:30
  • Thanks David, we found the issue, it was caused by too many unnecessary geocoding searching requests in our codes as what you said. – Steven Hu Jun 23 '16 at 02:13