2016-11-11 3 views
2

Ich entwickle Android-App und jetzt habe ich ein Problem. Unten ist ein Teil meines Codes und der "for" -Teil wird übersprungen. Wenn ich einen Haltepunkt für eine Anweisung einfüge, stoppt sie an dem Punkt und führt die Zeilen sehr gut aus und erzeugt eine Ausgabe, die ich möchte. Wenn ich App einfach "renne", überspringt es diesen Teil, so dass sich der Wert für "String locations" nicht ändert. Ich habe gegoogelt und einige sagen, dass es Thread-Problem ist. Also habe ich Synchroinzed auf die Methode gesetzt, immer noch nicht funktioniert. Irgendwelche anderen Vorschläge?Java-Code wird nicht ausgeführt

UPDATE

Ich habe nur versucht zu zeigen Code Zusammenhang mit dem Problem, aber ich denke, zeigt jetzt die ganze für diejenigen sinnvoller wäre, die versuchen, so dass hier auf showMapActivity meine gesamten Code zu helfen. Sie können sehen, ich habe einige Wege ausprobiert und nichts hat funktioniert. Das Speichern von Pfadinformationen in der String-URL ist der Punkt, an dem ich ein Problem habe. Ich habe getestet, und andere Teile scheinen gut zu funktionieren. Ich weiß, dass mein Code wirklich massig ist, deshalb habe ich nur Teile des Codes gepostet. TMap-bezogene Klassen werden aus der JAR-Datei importiert.

public class showMapActivity extends Activity { 


TMapData tmapdata=new TMapData(); 
TMapView tmapView; 
TMapPoint origin, dest; 
volatile ArrayList<TMapPoint> points=new ArrayList<>(); 
private TextView x; 
private TextView y; 
private HashMap<String,LatLng> coordinates; 
private HashMap<LatLng,Double> finalpoint; 

static private ConcurrentHashMap<Double,Double> path; 
@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_show_map); 
    coordinates=new HashMap<>(); 
    Intent intent=getIntent(); 
    tmapView=new TMapView(this); 
    path=new ConcurrentHashMap<>(); 
    coordinates=(HashMap<String,LatLng>)intent.getSerializableExtra("coordinate"); 
    path=getPathPoints(coordinates); 
    int i=0; 
    String url=getUrl(); 
    //String url = "https://maps.googleapis.com/maps/api/elevation/json?locations="; 
    //String locations=""; 
    /* 
    Iterator<Double> keys= path.keySet().iterator(); 
    while(keys.hasNext()){ 
     Double key=keys.next(); 
     //String lat=String.valueOf(key); 
     //String lng=String.valueOf(path.get(key)); 
     locations=locations+String.valueOf(key)+","+String.valueOf(path.get(key)); 
     if(keys.hasNext()) 
      locations=locations+"|"; 
    }path.entrySet() 

*/ 

    /* 

    for(ConcurrentHashMap.Entry<Double,Double> elem : path.entrySet()) 
    { 
     String lat=String.valueOf(elem.getKey()); 
     String lng=String.valueOf(elem.getValue()); 
     locations=locations+lat+","+lng; 
     i++; 
     if(i!=path.size()) 
     { 
      locations=locations+"|"; 
     } 
    } 
    */ 

    //url=url+locations+"&key=AIzaSyDD88VFMPIfC5sr0XsFL0PDCE-QRN8gQto"; 

    //String url=getUrl(path); 
    FetchUrl fetchUrl=new FetchUrl(); 
    fetchUrl.execute(url); 

} 
private ConcurrentHashMap<Double,Double> getPathPoints(HashMap<String,LatLng> coordinates) 
{ 
    final ConcurrentHashMap<Double,Double> Path=new ConcurrentHashMap<>(); 
    tmapView.setSKPMapApiKey("6bb5b7f3-1274-3c5e-ba93-790aee876673"); 
    origin=new TMapPoint(coordinates.get("origin").latitude,coordinates.get("origin").longitude); 
    dest=new TMapPoint(coordinates.get("dest").latitude,coordinates.get("dest").longitude); 
    tmapdata.findPathData(origin, dest, new TMapData.FindPathDataListenerCallback() { 
     @Override 
     public void onFindPathData(TMapPolyLine polyLine) { 
      points=polyLine.getLinePoint(); 
      for(TMapPoint point : points) 
       Path.put(point.getLatitude(),point.getLongitude()); 

     } 
    }); 
    return Path; 
} 
//ConcurrentHashMap<Double,Double> path 
private synchronized String getUrl() { 

    int i=0; 
    String url = "https://maps.googleapis.com/maps/api/elevation/json?locations="; 
    String locations=""; 
    for(HashMap.Entry<Double,Double> elem : path.entrySet()) 
    { 
     String lat=String.valueOf(elem.getKey()); 
     String lng=String.valueOf(elem.getValue()); 
     locations=locations+lat+","+lng; 
     i++; 
     if(i!=path.size()) 
     { 
      locations=locations+"|"; 
     } 
    } 
    url=url+locations+"&key=AIzaSyDD88VFMPIfC5sr0XsFL0PDCE-QRN8gQto"; 

    //https://maps.googleapis.com/maps/api/elevation/json?locations= 
    // 39.7391536,-104.9847034|36.455556,-116.866667&key=AIzaSyDD88VFMPIfC5sr0XsFL0PDCE-QRN8gQto 
    // Output format 


    return url; 
} 
private class FetchUrl extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... url) { 

     // For storing data from web service 
     String data = ""; 

     try { 
      // Fetching the data from web service 
      //downloadURL 
      data = downloadUrl(url[0]); 
      Log.d("Background Task data", data.toString()); 
     } catch (Exception e) { 
      Log.d("Background Task", e.toString()); 
     } 
     return data; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 


     //ParserTask 
     ParserTask parserTask = new ParserTask(); 

     // Invokes the thread for parsing the JSON data 
     parserTask.execute(result); 

    } 
} 
private String downloadUrl(String strUrl) throws IOException { 
    String data = ""; 
    InputStream iStream = null; 
    HttpURLConnection urlConnection = null; 
    try { 
     URL url = new URL(strUrl); 

     // Creating an http connection to communicate with url 
     urlConnection = (HttpURLConnection) url.openConnection(); 

     // Connecting to url 
     urlConnection.connect(); 

     //읽은 데이터를 버퍼에 저장 
     // Reading data from url 
     iStream = urlConnection.getInputStream(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

     StringBuffer sb = new StringBuffer(); 

     String line = ""; 
     while ((line = br.readLine()) != null) { 
      sb.append(line); 
     } 

     data = sb.toString(); 
     Log.d("downloadUrl", data.toString()); 
     br.close(); 

    } catch (Exception e) { 
     Log.d("Exception", e.toString()); 
    } finally { 
     iStream.close(); 
     urlConnection.disconnect(); 
    } 
    return data; 
} 

private class ParserTask extends AsyncTask<String, Integer, ArrayList<Double>> { 

    // Parsing the data in non-ui thread 
    @Override 
    protected ArrayList<Double> doInBackground(String... jsonData) { 

     JSONObject jObject; 
     ArrayList<Double> altitude = null; 

     try { 
      jObject = new JSONObject(jsonData[0]); 
      Log.d("ParserTask",jsonData[0].toString()); 
      //DataParser class 호출 
      DataParser parser = new DataParser(); 
      Log.d("ParserTask", parser.toString()); 

      // Starts parsing data 
      altitude = parser.parse(jObject); 
      Log.d("ParserTask","Getting Altitudes"); 
      Log.d("ParserTask",altitude.toString()); 

     } catch (Exception e) { 
      Log.d("ParserTask",e.toString()); 
      e.printStackTrace(); 
     } 
     return altitude; 
    } 

    // Executes in UI thread, after the parsing process 
    @Override 
    protected void onPostExecute(ArrayList<Double> result) { 
     finalpoint=new HashMap<>(); 
     LatLng latLng; 
     int i=0; 
     for(HashMap.Entry<Double,Double> elem : path.entrySet()) 
     { 
      latLng=new LatLng(elem.getKey(),elem.getValue()); 
      finalpoint.put(latLng,result.get(i++)); 
     } 
     x = (TextView) findViewById(R.id.textView5); 
     y = (TextView) findViewById(R.id.textView6); 
     x.setText(String.valueOf(finalpoint.get(coordinates.get("origin")))); 
     y.setText(String.valueOf(finalpoint.get(coordinates.get("dest")))); 
    } 

} 

}

+0

Ihre Methode liegt außerhalb der Klasse. Bitte bearbeiten Sie erneut mit dem richtigen Code –

+0

Und Sie benötigen eine AsyncTask (oder andere thread-bezogene Methoden) in Android, um eine Vernetzung zu tun –

Antwort

0

(Entschuldigt dies als eine Antwort veröffentlichen - ich habe noch nicht den erforderlichen Ruf zu kommentieren)

einfach das Hinzufügen synchronized ein Verfahren nicht notwendigerweise Thread-Sicherheit garantieren .

Wie und wann wird path aufgefüllt?

Update nach zusätzlichen Informationen

Das Problem, dass der Pfad zu sein scheint asynchron erzeugt werden, und Sie versuchen, sie zu verwenden, bevor die Generierung (oder vielleicht sogar begonnen) beendet hat. Dies passiert, weil die findPathData einfach den Generierungsprozess startet und sofort zurückkehrt (d. H. Bevor der Generierungsprozess beendet ist). In deinem Code gehst du dann weiter und erstellst die URL, die die Punktdaten sofort enthalten soll. Zu diesem Zeitpunkt ist der Hintergrundpunkterzeugungsprozess möglicherweise noch nicht abgeschlossen und möglicherweise noch gar nicht gestartet. Daher ist die Punktkarte möglicherweise leer oder unvollständig und Ihre URL wird nicht wie erwartet generiert.

Sie müssen eine Möglichkeit finden, zu warten, bis alle Pfaddaten von der asynchronen Verarbeitung zurückgegeben wurden, bevor Sie die URL erstellen. Es sieht so aus, als könnte es sehr schwierig, wenn nicht sogar unmöglich sein, mit der Version der findPathData Methode, die Sie verwenden, da sie Punkte über den Callback einzeln zurückgibt und Sie möglicherweise nicht wissen, wie viele generiert werden.

Ich hatte einen kurzen Blick auf die API für TMapData und es hat eine findPathDataAll Methode, die scheint, alle Punkte zu generieren und sie in einem einzigen Callback-Aufruf statt eins nach dem anderen zurückzugeben. Wenn dies tatsächlich der Fall ist (ich kann leider nicht Koreanisch lesen), könnten Sie diese Methode verwenden und dann die URL aus dem Callback generieren, denn wenn sie aufgerufen wird, wissen Sie, dass der Generierungsprozess abgeschlossen wurde. Wenn Sie dies tun, achten Sie darauf, dass Sie sich im Hauptthread befinden, bevor Sie mit der Benutzeroberfläche oder der Aktivität interagieren.

Hoffe, dass hilft.

+0

static private ConcurrentHashMap Pfad; Der Pfad wird beim Starten der Aktivität ausgefüllt. Ich habe meine Frage mit mehr Informationen aktualisiert :-). Vielen Dank im Voraus! – Hoon

+0

Das ist einfach die Definition der Variablen. Bitte teilen Sie uns mit, wie und wann Sie es initialisieren und fügen Sie die Daten hinzu, von denen Sie erwarten, dass sie in Ihrer Frage für die "for" -Schleife verfügbar sind. – clownba0t

+0

Würde es Ihnen etwas ausmachen, den Code für die Aktivität zu veröffentlichen? – clownba0t