2016-11-11 2 views
2

안드로이드 앱을 개발하고 있는데 문제가 있습니다. 아래는 내 코드의 일부이며 "for"부분은 건너 뜁니다. statement 안에 breakpoint를 넣을 때, 그 지점에서 정지하고, 줄을 잘 실행하고, 원하는 출력을 만듭니다. 앱을 '실행'할 때 '문자열 위치'값이 변경되지 않도록 해당 부분을 건너 뜁니다. 내가 봤 거든 일부는 스레드 관련 문제라고. 그래서 나는 그 방법에 대해 싱크로 염려했으나 아직 작동하지는 않습니다. 다른 제안?자바 코드가 실행되지 않는다

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

(대답으로이 게시 사과 - 아직 언급하는 데 필요한 평판이없는)

간단히 반드시 스레드 안전을 보장하지 않는 방법에 synchronized 추가 .

언제 어떻게 path이 채워 집니까? 추가 정보는 이후

업데이트 문제는 경로 포인트가 비동기 적으로 발생되고있는 것 같다, 당신은 생성 과정이 완료 (또는 심지어 시작) 전에이를 사용하려고하는

를 제공했다. 이는 findPathData이 단순히 생성 프로세스를 시작하고 즉각적으로 (즉, 생성 프로세스가 완료되기 전에) 반환하기 때문입니다. 그런 다음 코드에서 포인트 데이터가 포함될 것으로 예상되는 URL을 즉시 작성하십시오. 이 시점에서 백그라운드 포인트 생성 프로세스가 완료되지 않았거나 시작되지 않았을 수 있습니다. 결과적으로 포인트 맵이 비어 있거나 불완전 해져서 URL이 예상대로 생성되지 않습니다.

URL을 만들기 전에 비동기 처리로 모든 경로 지점 데이터가 반환 될 때까지 기다리는 방법을 찾아야합니다. 이것은 한 번에 하나의 콜백을 통해 포인트를 반환하고 생성되는 숫자를 알지 못하기 때문에 사용하는 findPathData 메소드의 버전으로 불가능하지는 않더라도 매우 어려울 수 있습니다.

TMapData 용 API를 간단히 살펴본 결과 findPathDataAll 메서드는 모든 점을 생성하여 하나씩 콜백 호출로 반환하는 것처럼 보입니다. 이것이 실제로 무슨 일을하는 경우 (미안하지만 한국어는 읽을 수 없음)이 메서드를 사용하여 콜백에서 URL을 생성 할 수 있습니다. 콜백에서 생성 프로세스가 완료되었음을 알게 되었기 때문입니다. 이렇게하면 UI 또는 활동과 상호 작용하기 전에 주 스레드에 있는지 확인하십시오.

희망이 있습니다.

+0

정적 개인용 ConcurrentHashMap 경로; 경로는 활동이 시작될 때 채워집니다. 나는 내 질문을 더 많은 정보로 업데이트했다 :-). 미리 감사드립니다. – Hoon

+0

이것은 단순히 변수의 정의입니다. 언제 초기화하는지, 그리고 질문에'for' 루프를 사용할 수있을 것으로 예상되는 데이터를 어떻게 추가하는지 알려주세요. – clownba0t

+0

활동 코드를 게시 하시겠습니까? – clownba0t

관련 문제