2016-11-11 38 views
2

我開發android應用程序,現在我有問題。下面是我的代碼的一部分,它不斷跳過「for」部分。當我在語句內部放置一個斷點時,它停止在這個點上,並且很好地執行這些行併產生我想要的輸出。當我「運行」應用程序時,它會跳過該部分,因此「字符串位置」值不會更改。我谷歌搜索,有人說這是線程相關的問題。所以我把這個方法同步了,仍然沒有工作。還有其他建議嗎?Java代碼得不到執行

UPDATE

我試圖表明代碼只涉及到這個問題,但我覺得現在顯示整個將是那些誰試圖幫助所以這裏是我的showMapActivity全部代碼更加有用。你可以看到我嘗試了一些方法,沒有任何工作。將路徑的信息保存到String url是我遇到問題的地方。我測試過了,其他部分似乎工作正常。我知道我的代碼真的很笨,這就是爲什麼我只發佈部分代碼。 TMap相關類從.jar文件導入。

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

您的方法不屬於該類。請再次使用正確的代碼編輯 –

+0

並且您需要在Android中使用AsyncTask(或其他線程相關的方法)來執行任何聯網 –

回答

0

(道歉張貼這作爲一個答案 - 我還沒有所需的口碑評論)

簡單地增加​​的方法不一定保證線程安全。

如何以及何時path被填充?之後更多的信息

更新提供

的問題似乎正在異步生成的路徑點,您要使用它們的生成過程完成之前(或者甚至開始)。發生這種情況是因爲findPathData只是簡單地啓動生成過程並立即返回(即在生成過程結束之前)。在你的代碼中,你繼續建立應該包含點數據的URL。此時背景點生成過程可能尚未完成,甚至可能還沒有開始。因此,點圖可能爲空或不完整,並且您的網址不會像您期望的那樣生成。

您需要找到一種方法,在創建URL之前,先等待所有路徑點數據由異步處理返回。這看起來像你使用的findPathData方法的版本可能非常困難,如果不是不可能的話,因爲它一次通過回調返回一個點,你可能不知道會產生多少個點。

我有一個快速瀏覽一下TMapData的API,它有一個findPathDataAll方法,這似乎生成所有的點,在一個回撥電話,而不是逐個歸還。如果確實如此(對不起,我無法閱讀韓語),則可以使用此方法,然後從回調中生成URL,因爲當它被調用時,您知道生成過程已完成。如果你這樣做,在與UI或Activity交互之前要小心確保你在主線程上。

希望有所幫助。

+0

static private ConcurrentHashMap path;當活動開始時,路徑被填充。我用更多的信息更新了我的問題:-)。提前致謝! – Hoon

+0

這就是變量的定義。請告訴我們如何以及何時將它初始化,並將數據添加到您希望可用於問題中for循環的數據。 – clownba0t

+0

你介意發佈活動的代碼嗎? – clownba0t