2010-12-28 2 views
0

Ich benutze den von Fedor bereitgestellten Code im folgenden Link, um den Breiten- und Längengrad von meiner einfachen Demo-App zu erhalten. Ich versuche, den Breiten- und Längengrad mithilfe der von ihm bereitgestellten MyLocation-Klasse in diesem Link abzurufen.Fortschrittsdialog wird beendet, bevor der Thread fertig ist - Android

What is the simplest and most robust way to get the user's current location on Android?

Ich versuche, die geografische Breite und Länge auf eine Schaltfläche klicken zu holen. Auf der Schaltfläche klicken, starte ich eine asynchrone Aufgabe und delegiere die Arbeit zum Abrufen von Orten an die Methode do in background meiner asynctask.

Vorausführung - Progressdialog eingeleitet. post execute - Fortschrittsdialog wurde geschlossen.

Dies ist, wie der Fortschritt Dialog in meinem Code funktionieren sollte und hier ist das Problem, das ich habe. Der Fortschrittsdialog wird korrekt gestartet, aber noch bevor der Längen- und Breitengrad in der doinbackground-Methode ausgegeben wird, wird der Fortschrittsdialog geschlossen.

Ich verstehe nicht, warum das passiert.

Hier ist meine Front-End-Aktivität

public class LocationServices extends Activity { 
MyLocation myLocation = new MyLocation(); 
LocationResult locationResult; 
TextView tv1, tv2; 
Location location; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    tv1 = (TextView) findViewById(R.id.tv1); 
    tv2 = (TextView) findViewById(R.id.tv2); 


    Button btn = (Button) findViewById(R.id.Button01); 
    btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new LocationAsyncTasking().execute(); 

     } 
    }); 

} 

public class LocationAsyncTasking extends AsyncTask<String, Void, Void> { 

    ProgressDialog dialog; 
    int totalAvail; 

    protected void onPreExecute() { 

     // this.dialog.setMessage("Inserting data..."); 
     dialog = new ProgressDialog(LocationServices.this); 
     this.dialog.setMessage("Fetching data..."); 
     this.dialog.show(); 
    } 

    protected Void doInBackground(String... args) { 
     Looper.prepare(); 

     locationResult = new LocationResult() { 

      public void gotLocation(Location location) { 
       // TODO Auto-generated method stub 

       // LocationServices.this.location = location; 
       System.out.println("Progress dialog should be present now - latitude"+location.getLatitude()); 
       System.out.println("Progress dialog should be present now - longitude"+location.getLongitude()); 
      } 
     }; 
     myLocation.getLocation(LocationServices.this, locationResult); 

     return (null); 
    } 

    protected void onProgressUpdate(Integer... progress) { 

    } 

    protected void onPostExecute(Void unused) { 
     dialog.dismiss(); 
    } 

} 

}

Ich bin ganz verwirrt, denken, was macht diesen Dialog Fortschritt verschwinden, noch bevor der SOP in doinbackground beendet ist.

Experten, bitte helfen Sie mir, dieses Problem zu verstehen und zu lösen.

Jede Hilfe in dieser Hinsicht ist sehr geschätzt.

Wir freuen uns, Mit besten Grüßen, Rony

Antwort

0

So ähnlich. Fügen Sie einfach ProgressDialog hinzu, wenn Sie es brauchen.

public class LocationServices extends Activity { 
    MyLocation myLocation = new MyLocation(); 
    TextView tv1, tv2; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv1 = (TextView) findViewById(R.id.tv1); 
     tv2 = (TextView) findViewById(R.id.tv2); 

     Button btn = (Button) findViewById(R.id.Button01); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       myLocation.getLocation(LocationServices.this, locationResult); 
      } 
     }); 

    } 

    public LocationResult locationResult = new LocationResult() { 
      public void gotLocation(Location location) { 
       runOnUiThread(new Runnable(){ 
        @Override 
        public void run(){ 
         tv1.setText(location.getLatitude()); 
         tv2.setText(location.getLongitude()); 
        } 
       }); 
      } 
     }; 
} 
+0

Entschuldigung, ich kann die Methode nicht sehen, Code hier zu addieren, also paste ich es hier direkt. – user264953

+0

final MyLocation myLocation = neu MyLocation(); \t \t final LocationResult locationResult = new LocationResult() { \t \t \t \t \t \t @Override \t \t \t public void gotLocation (Lage, Lage) { \t \t \t \t // TODO Automatisch generierte Methode Stub \t \t \t \t \t \t \t} \t \t}; \t \t \t \t btn.setOnClickListener (neu OnClickListener() { \t \t \t @Override \t \t \t public void onClick (Blick v) { \t \t \t \t myLocation.getLocation (LocationServices.this, locationResult); \t \t \t \t tv1.setText ("latitude"); // muss Breitengrad hinzufügen Ich bekomme hier \t \t \t \t tv2.setText ("Länge"); // brauchen Länge hinzuzufügen i hier \t \t \t} \t \t}); – user264953

+0

Ich habe nach Ihrem Vorschlag, aber wie bekomme ich loc.getlat() und loc.getlon(), um die Werte auf die Textansicht, die ich habe ... auch, vor der Einstellung dieser Werte, will ich nicht Benutzer, um eine andere Aktion innerhalb der Aktivität durchzuführen .. Also, um ihn daran zu hindern und die anderen Komponenten im Hintergrund anzuzeigen, während die Lat, long ist geholt, sollte ich einen Spinner verwenden, RT? – user264953

1

fand ich alle Beispiele eher verwirrend neu zu sein, um Android-Programmierung, am Ende ... die einfachste war derjenige, der gearbeitet, so ist diese Antwort auf der Grundlage der Kommentar darüber hat den Code eingefügt in es, aber ich habe meine volle Aktivität angehängt, die funktioniert .. in dem die Etiketten mit dem Standort aktualisiert werden, nachdem Sie den Knopf gedrückt haben. Dachte, es macht jemandem das Leben leichter. Oh, und stellen Sie sicher, dass Sie die MyLocation-Klasse wie oben erwähnt verwenden.

package com.benderapp; 

import android.app.Activity; 
import android.location.Location; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

import com.benderapp.MyLocation.LocationResult; 

public class DefaultActivity extends Activity { 
    MyLocation myLocation = new MyLocation(); 
    TextView tv1, tv2; 
    Button btn; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv1 = (TextView)findViewById(R.id.tv1); 
     tv2 = (TextView)findViewById(R.id.tv2); 
    btn = (Button)findViewById(R.id.Button01); 

    final MyLocation myLocation = new MyLocation(); 
     final LocationResult locationResult = new LocationResult() { 

      @Override 
      public void gotLocation(Location location) { 
        // TODO Auto-generated method stub 
        tv1.setText(location.getLatitude() + "");//need to add latitude i get here 
        tv2.setText(location.getLongitude() + "");//need to add longitude i get here      
      } 
    }; 


    btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        myLocation.getLocation(DefaultActivity.this,locationResult); 
      } 
     });  
    } 
}