2017-04-06 1 views
-1

Bonjour J'essaie de dessiner des polygones sur une carte google après avoir reçu les données d'un appel HTTP. Je reçois toujours la même erreur:Android Dessiner Polygone sur Google Map après une requête HTTP

FATAL EXCEPTION: OkHttp Dispatcher 
Process: com.example.rtuya.secmerev2, PID: 1011                  
java.lang.IllegalStateException: Not on the main thread 

Voici comment je fais mon appel HTTP, puis comment je tente de dessiner mes domaines:

private void getZones() throws JSONException { 
     Request request = new Request.Builder().url(getString(R.string.main_url) + "/api/getZones") 
       .headers(buildStandardHeaders(Stormpath.accessToken())) 
       .get() 
       .build(); 

     okHttpClient.newCall(request).enqueue(new Callback() { 
      @Override public 
      void onFailure(Call call, IOException e) { 
       Log.d("DEBUG", "ERROR"); 
      } 
      @Override public void onResponse(Call call, Response response)throws IOException { 
       try { 
        JSONArray responseArray = new JSONArray(response.body().string()); 
        zones = new ArrayList<ZoneData>(); 
        for (int i=0; i < responseArray.length(); i++) { 
         db.addZone(new ZoneData(responseArray.getJSONObject(i))); 
         zones.add(new ZoneData(responseArray.getJSONObject(i))); 
        } 
        isTrackingServiceRunning = startService(new Intent(ActivityMain.this, ServiceTracking.class)); 
        bindService(new Intent(ActivityMain.this, ServiceTracking.class), trackerServiceConnection, Context.BIND_AUTO_CREATE); 
        drawAreasOnDashboard(); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       }; 
      } 
     }); 
    } 

est en dessous de la façon dont je tente de tirer mes zones et erreur se produit toujours sur la ligne qui contient areaMap.drawPolygones():

public void drawAreas() { 
     int polygoneFillingIndex = 1; 
     if(ActivityMain.zones != null) { 
      for (ZoneData zone : ActivityMain.zones) { 
       int color; 
       if ((polygoneFillingIndex % 2) == 0) { 
        color = R.color.polygoneFillingBlue; 
       } else { 
        color = R.color.polygoneFilingGreen; 
       } 
       areasMap.addPolygon(new PolygonOptions() 
         .add(zone.getP1(), zone.getP2(), zone.getP3(), zone.getP4()) 
         .strokeColor(ResourcesCompat.getColor(getResources(), R.color.polygoneStroke, null)) 
         .fillColor(ResourcesCompat.getColor(getResources(), color, null)) 
         .zIndex(Float.valueOf(zone.getPosititionInArray())) 
         .clickable(true)); 

       polygoneFillingIndex++; 
      } 
     } 
    } 

Répondre

1

que les journaux d'erreur indique exactement où vous avez tort. Android ne vous permet pas d'exécuter des requêtes http sur le thread principal afin qu'il ne soit pas bloqué par celui-ci. Vous devez encapsuler ces requêtes http dans AsyncTasks, vous pouvez trouver des tonnes d'exemples ici sur SO ou n'importe où sur le web

+0

droite je l'ai eu mais je n'ai jamais utilisé asynch taks alors comment pourrais-je le faire? –

+0

Voici un exemple: https://www.google.it/amp/s/androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/amp/ la fonction onPostExecute() est exécutée sur le fil principal et vous pouvez effectuer vous dessinez là –