2016-11-11 41 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