2016-11-11 11 views
2

アンドロイドアプリを開発して今問題があります。以下は私のコードの一部であり、 "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

もう1つのネットワーキングを行うには、AndroidにAsyncTask(またはその他のスレッド関連のメソッド)が必要です。 –

答えて

0

(答えとしてこれを掲示するための謝罪 - 私はまだコメントするために必要な評判を持っていない)

だけで、必ずしもスレッドの安全性を保証するものではありません方法に​​を追加します。

pathにはどのようなデータが設定されていますか?問題

を提供し、追加情報の後

アップデートは、パスポイントは非同期に発生していることのようだ、とあなたは、生成プロセスが終了した(またはおそらく開始)する前にそれらを使用しようとしています。これは、findPathDataが単に生成プロセスを開始し、直ちに(すなわち、生成プロセスが終了する前に)戻るために発生します。あなたのコードでは、ポイントデータを含むと思われるURLをすぐに作成します。この時点で、バックグラウンドポイントの生成プロセスは完了しておらず、開始されていない可能性もあります。その結果、ポイントマップは空でも不完全であっても、期待通りにURLは生成されません。

URLを作成する前に、すべてのパスポイントデータが非同期処理によって返されるまで待機する方法を見つける必要があります。これは、一度に1つのコールバックを介してポイントを返すため、生成する数がわからないことがあるので、使用しているfindPathDataメソッドのバージョンでは、不可能ではないにしても、非常に難しいようです。

私はTMapData用のAPIを簡単に見ていて、すべてのポイントを生成し、それらを1つずつではなく1つのコールバック呼び出しで返すようなfindPathDataAllメソッドを持っています。これが本当にあれば(申し訳ありませんが、私は韓国語を読むことができません)、このメソッドを使用してコールバックからURLを生成することができます。なぜなら、生成プロセスが完了したことを知ったときです。これを行う場合は、UIやアクティビティとやりとりする前に、あなたがメインスレッドにいることを確認してください。

希望に役立ちます。

+0

静的専用のConcurrentHashMap パス;アクティビティの開始時にパスが設定されます。私はより多くの情報で私の質問を更新しました:-)。事前にありがとう! – Hoon

+0

これは単に変数の定義です。いつどのようにして初期化しているのか、あなたの質問の 'for'ループで利用可能と思われるデータを追加してください。 – clownba0t

+0

アクティビティのコードを投稿してもよろしいですか? – clownba0t

関連する問題