LocationListener พร้อม Geocoded Toast ไม่หยุดเมื่อกิจกรรมออกจาก OnCreate

ฉันมี locationListener แบบธรรมดาที่ใช้ GPS เพื่อเริ่มต้นเท่านั้น ภายใน OnLocationChanged ฉันทำการค้นหารหัสภูมิศาสตร์และแสดงข้อความ Toast ปัญหาคือเมื่อกิจกรรมไม่อยู่ข้างหน้าอีกต่อไป GPS ยังคงได้รับการอัปเดตและประมวลผล Toasto ฉันมี RemoveUpdates ใน onStart, onPause, onDestroy และ onStop

มีความคิดใดบ้างว่าทำไมฉันไม่สามารถหยุดบริการนี้ได้

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

นี่คือ LogCat เมื่อพยายามกลับบ้าน

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 แหล่งที่มา
comment
อืมมม ฉันสงสัยว่าฉันต้องตั้งค่า locationListener=null; เช่นกัน?   -  person Kuli    schedule 28.12.2010


คำตอบ (1)


คุณไม่ได้เอาชนะวิธีการใดๆ

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

นั่นไม่ใช่ลายเซ็นวิธีการสำหรับวิธีการเหล่านั้น มันควรจะเป็น

@Override
protected void onStart(){

}

ฯลฯ

คุณควรทำความคุ้นเคยกับการเพิ่มคำอธิบายประกอบ @Override ให้กับวิธีการที่คุณกำลังแทนที่

person Falmarri    schedule 28.12.2010
comment
คุณอาจได้รับ IllegalArgumentException นักพัฒนา .android.com/reference/android/location/ คุณต้องโพสต์ข้อผิดพลาดจาก logcat ของคุณเพื่อช่วยอีกต่อไป - person Falmarri; 29.12.2010
comment
ข้อความจะบอกคุณอย่างชัดเจนว่าปัญหาคืออะไร คุณต้องเรียก super.onStart() เป็นสิ่งแรกในวิธี onStart() ของคุณ - person Falmarri; 29.12.2010
comment
เห็นได้ชัดว่าคุณยังไม่ได้ผ่านบทช่วยสอนพื้นฐานของ Android คุณควรทำเช่นนั้น สิ่งเหล่านี้คือสิ่งพื้นฐานที่คุณควรรู้ - person Falmarri; 29.12.2010
comment
จริงๆ แล้วฉันมี ฉันรู้สึกประหลาดใจที่แอปทำงานได้โดยไม่ต้องใช้ onStart() และฉันก็แค่ถามคำถาม ไม่ต้องตั้งคำถามว่าฉันทำอะไร/ไม่รู้ - person Kuli; 29.12.2010
comment
@Kuli: เป็นที่ยอมรับอย่างสมบูรณ์ที่จะไม่แทนที่วิธีวงจรชีวิตของกิจกรรมอื่น ๆ นอกเหนือจาก onCreate() - person Falmarri; 29.12.2010
comment
ขอบคุณ Falmari - เป็นวันที่ยาวนาน! ฉันคิดว่าฉันทำตามตรรกะของสิ่งที่เกิดขึ้น โดย @Override onPause ฉันได้ระงับ Listener ไว้ชั่วคราว แต่สิ่งที่เกิดขึ้นจริงคือฉันมีมันในหลายวิธี onPause จะครอบคลุมเมื่อแอปพลิเคชันออกจากโฟกัส ไม่ว่าแอปพลิเคชันจะตายหรือไม่ก็ตาม ฉันมีมากกว่าหนึ่งวิธีและนั่นเป็นสาเหตุของปัญหา :( - person Kuli; 29.12.2010
comment
ได้. คุณสามารถเรียก RemoveUpdates() ได้เพียงครั้งเดียวเท่านั้นสำหรับ Listener แต่ละตัวที่เพิ่ม - person Falmarri; 29.12.2010