2016-04-15 14 views
2

Dies ist mein Code. Ich möchte den Wert lat, log Variable von JSONTask zu onMapReady nennen.So rufen Sie den Wert von Variablen von einer Klasse zur anderen in 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)); 
} 

Antwort

0

Ich benutze gemeinsame Vorlieben für diese Art von Aufgaben, , die btw eine Art Hack ist.

0

Zunächst AsyncTask könnte noch nicht fertig sein, wenn Sie onMapReady() Methode aufgerufen wird.
Sie sollten dies überprüfen, zum Beispiel, wenn (lat != 0 && lon !=).

Dann, was ist das Problem?
Ansage Variable lat, lon in Ihrer Klasse.
Und in onPostExecute() analysieren Ihre String mit split(" - ") - es Ihnen String array von zwei Elementen geben wird, dann lat = Double.parseDouble(yourArray[0]) und lon = Double.parseDouble(yourArray[1]) macht lat und lon zu bekommen.

0

Versuchen Sie, lat und long Variablen als global zu definieren.

0

Sie können einen Listener-Schnittstelle als Code unten

schaffen Es ist besser für Karte warten bereit zu erhalten, bevor Sie Ihre lat und lange holen. so auf onMapReady können Sie Ihre AsyncTask ausführen und wenn Sie Sie addLatLng erhalten führen rufen kann der Marker

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 
     } 
    } 
} 

In Ihrer Aktivität/Fragment

@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)); 
} 

Hinweis hinzuzufügen: Sie müssen vielleicht einige Logik schreiben Vermeiden Sie es, mehrere Male dieselbe Markierung hinzuzufügen.

Verwandte Themen