LocationListener dengan Geocoded Toast tidak berhenti setelah aktivitas keluar dari OnCreate

Saya memiliki locationListener sederhana yang hanya menggunakan GPS untuk memulai. Di dalam OnLocationChanged saya melakukan pencarian geocode dan menampilkan pesan Toast. Soalnya setelah aktivitas tidak lagi di depan gps masih menerima update dan memproses Toasto. Saya memiliki RemoveUpdates di onStart, onPause, onDestroy dan onStop.

Adakah yang tahu mengapa saya tidak bisa menghentikan layanan ini?

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mapView = (MapView) findViewById(R.id.mapView);
    mc = mapView.getController();

    locationListener = new GPSLocationListener(); 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);           
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);    

...
...       

public void onStart(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

public void onPause(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

public void onDestroy(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

public void onStop(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

class GPSLocationListener implements LocationListener {     
    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {

          current_heading=location.getBearing();
          String current_bearing = headingToString2(location.getBearing());

          point = new GeoPoint(
              (int) (location.getLatitude() * 1E6), 
              (int) (location.getLongitude() * 1E6));

          // add marker
          MapOverlay mapOverlay = new MapOverlay();
          mapOverlay.setPointToDraw(point);
          List<Overlay> listOfOverlays = mapView.getOverlays();
          listOfOverlays.clear();
          listOfOverlays.add(mapOverlay);

          mapView.setStreetView(showStreet);
          // enable to show Satellite view
          mapView.setSatellite(showSatellite);        
          // enable to show Traffic on map
          mapView.setTraffic(showTraffic);        
          mapView.setBuiltInZoomControls(true);

          mc.animateTo(point);
          mc.setZoom(16);

          address = ConvertPointToLocation(point);
          Toast.makeText(getBaseContext(), address, Toast.LENGTH_LONG).show();
          Toast.makeText(getBaseContext(), address, Toast.LENGTH_LONG).cancel();
          }     
    } 

Ini LogCat saat mencoba pulang

12-28 16:41:51.402: ERROR/LocationMasfClient(577): reverseGeocode(): GLS failed with status 20
12-28 16:41:51.423: INFO/NotificationService(577): enqueueToast pkg=com.kuli.example.android511 callback=android.app.ITransientNotification$Stub$Proxy@4375d1f0 duration=1
12-28 16:41:53.272: DEBUG/LocationMasfClient(577): getAddressFromProtoBuf(): Ignore feature 0,Lyndon Station
12-28 16:41:53.282: INFO/NotificationService(577): enqueueToast pkg=com.kuli.example.android511 callback=android.app.ITransientNotification$Stub$Proxy@43711b70 duration=1
12-28 16:41:55.533: DEBUG/dalvikvm(633): GC freed 715 objects / 92504 bytes in 324ms
12-28 16:41:57.883: INFO/ActivityManager(577): Starting activity: Intent { action=android.intent.action.MAIN categories={android.intent.category.HOME} flags=0x10200000 comp={com.android.launcher/com.android.launcher.Launcher} }
12-28 16:41:57.932: DEBUG/LocationManager(1191): removeUpdates: listener = com.kuli.example.android511.android511$GPSLocationListener@43762f40
12-28 16:41:57.952: DEBUG/AndroidRuntime(1191): Shutting down VM
12-28 16:41:57.952: WARN/dalvikvm(1191): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
12-28 16:41:57.966: ERROR/AndroidRuntime(1191): Uncaught handler: thread main exiting due to uncaught exception
12-28 16:41:57.972: ERROR/AndroidRuntime(1191): android.app.SuperNotCalledException: Activity {com.kuli.example.android511/com.kuli.example.android511.android511} did not call through to super.onPause()
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2830)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2797)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2780)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.app.ActivityThread.access$2000(ActivityThread.java:112)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.os.Looper.loop(Looper.java:123)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at android.app.ActivityThread.main(ActivityThread.java:3948)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at java.lang.reflect.Method.invokeNative(Native Method)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at java.lang.reflect.Method.invoke(Method.java:521)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
12-28 16:41:57.972: ERROR/AndroidRuntime(1191):     at dalvik.system.NativeStart.main(Native Method)
12-28 16:41:57.992: INFO/Process(577): Sending signal. PID: 1191 SIG: 3
12-28 16:41:57.992: INFO/dalvikvm(1191): threadid=7: reacting to signal 3
12-28 16:41:58.133: INFO/dalvikvm(1191): Wrote stack trace to '/data/anr/traces.txt'
12-28 16:41:58.442: WARN/ActivityManager(577): Activity pause timeout for HistoryRecord{437b5170 {com.kuli.example.android511/com.kuli.example.android511.android511}}
12-28 16:43:08.393: DEBUG/dalvikvm(631): GC freed 9811 objects / 553776 bytes in 104ms

person Kuli    schedule 28.12.2010    source sumber
comment
hmmmmm, saya ingin tahu apakah saya perlu menyetel locationListener=null; demikian juga?   -  person Kuli    schedule 28.12.2010


Jawaban (1)


Anda tidak mengesampingkan metode apa pun.

public void onStart(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

public void onPause(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

public void onDestroy(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

public void onStop(Bundle savedInstanceState) {
    locationManager.removeUpdates(locationListener);
    locationManager=null;
}

Itu bukan tanda tangan metode untuk metode tersebut. Harus

@Override
protected void onStart(){

}

dll.

Anda harus terbiasa menambahkan anotasi @Override ke metode yang Anda ganti

person Falmarri    schedule 28.12.2010
comment
Anda mungkin mendapatkan pengembang IllegalArgumentException .android.com/reference/android/location/. Anda harus memposting kesalahan dari logcat Anda untuk membantu lagi. - person Falmarri; 29.12.2010
comment
Pesan tersebut memberi tahu Anda apa sebenarnya masalahnya. Anda harus memanggil super.onStart() sebagai hal pertama dalam metode onStart() Anda - person Falmarri; 29.12.2010
comment
Cukup jelas Anda belum mempelajari tutorial dasar Android. Anda harus melakukan itu, ini adalah hal mendasar yang harus Anda ketahui. - person Falmarri; 29.12.2010
comment
Sebenarnya sudah, saya terkejut aplikasinya berfungsi sama sekali tanpa onStart(). Dan saya hanya sekedar bertanya, tidak perlu mempertanyakan apa yang saya tahu/tidak tahu. - person Kuli; 29.12.2010
comment
@Kuli: Sangat dapat diterima untuk tidak mengganti metode siklus hidup aktivitas lainnya selain onCreate() - person Falmarri; 29.12.2010
comment
Terima kasih Falmari - SUDAH HARI YANG PANJANG! Saya rasa saya mengikuti logika dari apa yang terjadi. Dengan @Override onPause saya menangguhkan pendengar tetapi yang sebenarnya terjadi adalah saya memilikinya dalam beberapa metode, onPause mencakup ketika aplikasi meninggalkan fokus, apakah mati atau tidak. Saya memilikinya di lebih dari satu metode dan itulah yang menyebabkan masalah :( - person Kuli; 29.12.2010
comment
Ya. Anda hanya dapat memanggil deleteUpdates() satu kali untuk setiap pendengar yang ditambahkan. - person Falmarri; 29.12.2010