2016-04-15 10 views
2

これは私のコードです。 latlogの値をJSONTaskからonMapReadyに変更したいと思います。Java(Android)のあるクラスから別のクラスに変数の値を呼び出す方法

public class JSONTask extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 

      StringBuffer buffer = new StringBuffer(); 

      String line =""; 
      while ((line = reader.readLine()) != null){ 
       buffer.append(line); 
      } 

      String finalJson = buffer.toString(); 

      JSONObject parentObject = new JSONObject(finalJson); 

      // JSONObject finalObject = parentObject.getJSONObject(); 

      String latitude = parentObject.getString("geo"); 
      String[] coordinate = latitude.split(","); 

      double lat = Double.parseDouble(coordinate[0]); 

      double log = Double.parseDouble(coordinate[1]); 

      return lat + " - " + log ; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if(connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if(reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

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

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    // Add a marker in Sydney and move the camera 
    LatLng sydney = new LatLng(lat,log); 
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 

答えて

0

私はところでハックのいくつかの種類だタスクのような種類、 の共有設定を使用します。

0

最初に、メソッドが呼び出されたときにAsyncTaskが完了していない可能性があります。
これは、たとえば(lat != 0 && lon !=)の場合にチェックしてください。

次に、問題は何ですか?
変数lat, lonをクラスに発表します。
そして、onPostExecute()split(" - ")であなたStringを解析する - それは、緯度と経度を取得するlat = Double.parseDouble(yourArray[0])lon = Double.parseDouble(yourArray[1])を行い、その後、次の2つの項目のString arrayを与えるだろう。

0

latおよびlong変数をグローバルとして定義しようとします。

0

あなたはあなたの緯度と長いをフェッチする前に準備するためにマップを待つ方が良いです

次のコードのようにリスナーインタフェースを作成することができます。あなたはにいくつかのロジックを記述する必要がありますので、あなたのAsyncTaskを実行し、あなたがあなたの活動/フラグメント

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    new JsonTask(new JsonTask.OnLatLngReceivedListener() { 
     @Override 
     public void onLatLngReceived(LatLng latLng) { 
      addLatLng(latLng); 
     } 
    }).execute("YOUR_JSON_URL"); 
} 

private void addLatLng(LatLng latLng) { 
    // Add a marker in Sydney and move the camera 
    mMap.addMarker(new MarkerOptions().position(latLng).title("Marker in Sydney")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
} 

ノートでは、マーカー

public class JSONTask extends AsyncTask<String, Void, LatLng> { 

    interface OnLatLngReceivedListener { 
     void onLatLngReceived(LatLng latLng); 
    } 

    private OnLatLngReceivedListener listener; 

    public JsonTask(OnLatLngReceivedListener listener) { 
     this.listener = listener; 
    } 

    @Override 
    protected LatLng doInBackground(String... params) { 
     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 

      StringBuffer buffer = new StringBuffer(); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

      JSONObject parentObject = new JSONObject(buffer.toString()); 
      String latitude = parentObject.getString("geo"); 
      String[] coordinate = latitude.split(","); 

      double lat = Double.parseDouble(coordinate[0]); 
      double log = Double.parseDouble(coordinate[1]); 
      return new LatLng(lat, log); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(LatLng latLng) { 
     if (latLng != null && listener != null) { 
      listener.onLatLngReceived(latLng); 
     } else { 
      // SOME FAILING REPORT MECHANISM 
     } 
    } 
} 

を追加するaddLatLngを呼び出すことができる結果得れば可能onMapReadyに同じマーカーを複数回追加することは避けてください。

関連する問題