Wert einer Variablen auslesen - eigentlich für Anfänger

  • Antworten:15
Lars J.
  • Forum-Beiträge: 10

18.10.2014, 22:26:49 via Website

Hallo,

ganz einfache Sache, ich sehe wohl den Wald vor lauter Bäumen nicht mehr...

Ich habe eine Variable string_1:

 protected void onPostExecute(List<List<HashMap<String, String>>> result) {
    String string_1 = "hallo";

Wie bekomme ich den Wert von string_1 in meine Variable string_2; string_2 benutze ich in

 private void setUpMap() {
    string_2 = string_1;

Definiert habe ich string_2 in:

public class MapsActivity extends FragmentActivity {
    String string_2;       

Kurz: Irgendwie schaffe ich es nicht, den Wert string_1 aus der protected Methode zu bekommen. Was mache ich falsch?

Allerbesten Dank, auch für eine nur kurze Bemerkung.

— geändert am 18.10.2014, 22:28:09

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.10.2014, 22:49:56 via Website

Hallo Lars,
könntest du bitte deinen Vollständigen Code Posten, aus deinem Jetzigen schnipsel lässt sich der Fehler nur erahnen, um es dir aber mit sicherhei sagen zu können ist mehr Code erforderlich.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Georg C.
  • Forum-Beiträge: 235

18.10.2014, 22:59:56 via Website

Hallo, (der Pascal war schneller ... poste es trotzdem)
es gibt schon ein paar Möglichkeiten, nun wir wissen nicht ganz genau wie dein Code so aussieht. Deshalb nur grob!
Am einfachsten (aus deinem CODE - Post!!!!) wäre es per Instanz der MapsActivity klasse.
????
....
MapsActivity ma = new MapsActivity();
string_2 = ma.setUpMap();

nun es kommt schon off vor, das Anfänger sich viel selber komplizieren ....

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Lars J.
  • Forum-Beiträge: 10

18.10.2014, 23:17:16 via Website

Es geht um "teststring_1", welcher einen Wert "distance" erhalten soll und und einen "teststring_2", welchen einen Wert "Duration" erhalten soll.

public class MapsActivity extends FragmentActivity {

private GoogleMap myMap;
String teststring_1;
String teststring_2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
    }

private void setUpMapIfNeeded(){

        // 1. Try to obtain the map from the SupportMapFragment.
        myMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

        // 2. Check if we were successful in obtaining the map.
        if (myMap != null) {
            setUpMap();//
        }
    }


private void setUpMap() { 

    myMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);// NONE, NORMAL, SATELLITE, TERRAIN, HYBRID

    teststring_1 = distance;// hier liegt das Problem
    teststring_2 = duration;// hier liegt das Problem
};



 private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{

    // Parsing the data in non-ui thread
    @Override
    protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

        JSONObject jObject;
        List<List<HashMap<String, String>>> routes = null;

        try{
            jObject = new JSONObject(jsonData[0]);
            DirectionsJSONParser parser = new DirectionsJSONParser();

            // Starts parsing data
            routes = parser.parse(jObject);
        }catch(Exception e){
            e.printStackTrace();
        }
        return routes;
    }

    // Executes in UI thread, after the parsing process
    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> result) {
        ArrayList<LatLng> points = null;
        PolylineOptions lineOptions = null;
        MarkerOptions markerOptions = new MarkerOptions();
        String distance = "";
        String duration = "";

        if(result.size()<1){
            Toast.makeText(getBaseContext(), "No Points", Toast.LENGTH_SHORT).show();
            return;
        }

        // Traversing through all the routes
        for(int i=0;i<result.size();i++){
            points = new ArrayList<LatLng>();
            lineOptions = new PolylineOptions();

            // Fetching i-th route
            List<HashMap<String, String>> path = result.get(i);

            // Fetching all the points in i-th route
            for(int j=0;j<path.size();j++){
                HashMap<String,String> point = path.get(j);

                if(j==0){    // Get distance from the list
                    distance = (String)point.get("distance");
                    continue;
                }else if(j==1){ // Get duration from the list
                    duration = (String)point.get("duration");
                    continue;
                }

                double lat = Double.parseDouble(point.get("lat"));
                double lng = Double.parseDouble(point.get("lng"));
                LatLng position = new LatLng(lat, lng);

                points.add(position);
            }

            // Adding all the points in the route to LineOptions
            lineOptions.addAll(points);
            lineOptions.width(2);
            lineOptions.color(Color.RED);
        }


        Log.i("Distance: ", distance);// hier funktioniert es noch
        Log.i("Duration: ", duration);// hier funktioniert es noch
    }
}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.10.2014, 23:24:57 via App

Du musst das gerade anders rum machen.
Die duration etc. Variable muss als Klassenvariable deklariert werden, damit diese überall verfügbar ist. Es bringt dir ja nix wenn die testsrings überall verfügbar sind.

Edit:
@Georg: Du hast vergessen das Instanzen ei er Activity nix nüten, da Activitys über intents aufgerufen werden müssen.

— geändert am 18.10.2014, 23:26:31

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Georg C.
  • Forum-Beiträge: 235

19.10.2014, 01:13:30 via Website

@Pascal
upps - stimmt (lightbulb)

Sorry für Gramatik & Stilistik Fehler.

Antworten
Lars J.
  • Forum-Beiträge: 10

19.10.2014, 21:07:26 via Website

Pascal P.

Du musst das gerade anders rum machen.
Die duration etc. Variable muss als Klassenvariable deklariert werden, damit diese überall verfügbar ist. Es bringt dir ja nix wenn die testsrings überall verfügbar sind.

Edit:
@Georg: Du hast vergessen das Instanzen ei er Activity nix nüten, da Activitys über intents aufgerufen werden müssen.

Ich habe also jetzt in der Klasse "MapsActivity" wie folgt deklariert:

public class MapsActivity extends FragmentActivity {

private GoogleMap myMap;
String distance = "";
String duration = "";

um sodann in der Klasse "ParserTask" diese Variablen nicht mehr zu deklarieren:

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{


    [...]


    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> result) {
        ArrayList<LatLng> points = null;
        PolylineOptions lineOptions = null;
        MarkerOptions markerOptions = new MarkerOptions();
//            String distance = "";// bisher hier deklariert
//            String duration = "";// bisher hier deklariert


                if(j==0){    // Get distance from the list
                    distance = (String)point.get("distance");
                    continue;
                }else if(j==1){ // Get duration from the list
                    duration = (String)point.get("duration");
                    continue;
                }

              [...]
            }

          }

        Log.i("Distance_0: ", distance);// hier wird der korrekte Wert angezeigt
        Log.i("Duration_0: ", duration);// hier wird der korrekte Wert angezeigt
    }
}

Beim log.i (s. soeben) wird in der Klasse "ParserTask" der korrekte Wert angezeigt. Wie kann ich diese Variable jetzt weiter in der Klasse "MapsActivity" verwenden? Wenn ich nämlich hinter dem (in der Klasse "MapsActivity" erfolgten) Klassen(ParserTask)-aufruf ein Log.i setze, bekomme ich "keinen" Wert.

Irgendeine Idee/ eine Vermutung?

Besten Dank.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.10.2014, 21:44:38 via App

Irgendwie musst du die Daten ja auch aus dem parser Task heraus in die MapsActivity bekommen.
Machst du sowas?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Lars J.
  • Forum-Beiträge: 10

19.10.2014, 21:59:42 via Website

Genau das möchte ich. Ich möchte (zum Zwecke der weiteren Verwendung) die Variablen "distance" und "duration" in der MapsActivity auslesen, z.B. mit Log.i. Oder mit diesen Variablen weiterarbeiten.

Ich frage mich jetzt: Wie kann es sein, dass die Variable, die ich in der MapsActivity deklariert habe, in der ParserTask verwenden kann? Und dann NICHT in der MapsActivity auslesen kann?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.10.2014, 07:15:41 via App

Das liegt daran dass der Parser in einem AsyncTask ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Lars J.
  • Forum-Beiträge: 10

20.10.2014, 09:33:58 via Website

Pascal P.

Das liegt daran dass der Parser in einem AsyncTask ist.

Gibt es eine Lösung/ Vorgehensweise, die Dir einfiele? Sinn und Zweck ist es, die ermittelten Werte (distance und Duration) weiterzuverwerten (in einer List).

Herzlichen Dank auch für eine nur kurze Antwort.

Antworten
Lars J.
  • Forum-Beiträge: 10

20.10.2014, 09:36:12 via Website

Pascal P.

Das liegt daran dass der Parser in einem AsyncTask ist.

OnPostExecute?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.10.2014, 11:29:27 via Website

Da hast du auch recht, ich würde 2 getter Methoden definieren und die Variablen über diese nach dem laden Transferieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Lars J.
  • Forum-Beiträge: 10

20.10.2014, 11:46:45 via Website

Ich muss mich erst einlesen. Hoffe, ich darf mich dann nochmal melden.

Antworten
Lars J.
  • Forum-Beiträge: 10

20.10.2014, 22:02:18 via Website

O.K., die grundsätzliche Logik der Asynchronik erschließt sich mir. Wird wohl noch ein Problem beim Drehen der Ansicht werden, aber gut.

Meine kurze Frage zu den getter-Methoden. Ich habe zwar (viel) gefunden zur Frage des Auslesens des ENDergebnisses der AsyncTask (String z = AsyncTask.execute(url).get();", jedoch nichts zum Auslesen einer innerhalb dieser Instanz verwendeten Variablen. Wenn ich es richtig sehe, dann muss ich diese Methoden in der AsyncTask implementieren, so ähnlich wie "getdistance {z = distance; return (z)}" ? Und dann diese Methode in meiner MainActivity aufrufen per "getdistance ();" ?

Darf ich ein sehr kurzes Beispiel haben? Besten Dank.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.10.2014, 08:50:30 via Website

public class MapsActivity extends FragmentActivity {

private GoogleMap myMap;
String distance = "";
String duration = "";

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{

[...]


@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {[...}

}

public String getDuration()
{
return this.duration;
}

public String getDistance()
{
return this.distance;
}

Und in deiner Activity:

AsyncTast atask _ new AsyncTask();
[..]
atasc.getDuration(); //Wert holen

Vlt muss du noch prüfen ob der wert gesetzt ist, falls der Task noch nicht abgeschlossen ist.
Ggf sind hier auch Callbacks sinnvoll.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten