让我的 GPS 传感器停止时遇到一些问题
Posted
技术标签:
【中文标题】让我的 GPS 传感器停止时遇到一些问题【英文标题】:Having some trouble getting my GPS sensor to stop 【发布时间】:2012-01-22 07:44:20 【问题描述】:当我的应用程序退出时,我的 GPS 传感器会继续工作,或者当我更改活动时,我的应用程序会根据我的配置崩溃(在下面的代码中,当我更改活动或退出应用程序时它会崩溃)。如何更改我的以下活动,以便当我退出应用程序时 GPS 传感器停止运行,但当我移动到另一个活动时它继续运行?
这是我活动的关键部分:
public class InitialChoice extends Activity
LocationManager mlocManager;
LocationListener mlocListener;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.initial_screen);
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
@Override
protected void onStop()
//mlocManager.removeUpdates(mlocListener);
mlocManager.removeGpsStatusListener((Listener) mlocListener);
mlocManager = null;
如果我使用以下代码而不是 onStop(),则 gps 不会停止运行:
@Override
public void finish()
//mlocManager.removeUpdates(mlocListener);
mlocListener = null;
mlocManager = null;
LogCat:
12-16 21:54:58.120: D/LocationManager(909): requestLocationUpdates: provider = gps, listener = com.dummies.android.taskreminder.MyLocationListener@46284458 12-16 21:55:04.740: D/AndroidRuntime(909): 关闭虚拟机 12-16 21:55:04.740: W/dalvikvm(909): threadid=1: 线程以未捕获的异常退出 (group=0x400259f8) 12-16 21:55:04.750:E/AndroidRuntime(909):致命异常:主要 12-16 21:55:04.750:E/AndroidRuntime(909):java.lang.RuntimeException:无法停止活动 com.dummies.android.taskreminder/com.dummies.android.taskreminder.activity.InitialChoice:java。 lang.ClassCastException: com.dummies.android.taskreminder.MyLocationListener 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3632) 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.app.ActivityThread.handleStopActivity(ActivityThread.java:3677) 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.app.ActivityThread.access$2600(ActivityThread.java:135) 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2153) 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.os.Handler.dispatchMessage(Handler.java:99) 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.os.Looper.loop(Looper.java:144) 12-16 21:55:04.750: E/AndroidRuntime(909): 在 android.app.ActivityThread.main(ActivityThread.java:4937) 12-16 21:55:04.750: E/AndroidRuntime(909): at java.lang.reflect.Method.invokeNative(Native Method)
我的新错误来自这里的方法:Stop Location Listener in Android
12-16 23:10:50.295: W/dalvikvm(1272): threadid=1: 线程以未捕获的异常退出 (group=0x400259f8) 12-16 23:10:50.305:E/AndroidRuntime(1272):致命异常:主要 12-16 23:10:50.305:E/AndroidRuntime(1272):java.lang.RuntimeException:无法停止活动 com.dummies.android.taskreminder/com.dummies.android.taskreminder.activity.InitialChoice:android。 app.SuperNotCalledException:活动 com.dummies.android.taskreminder/com.dummies.android.taskreminder.activity.InitialChoice 没有调用 super.onStop() 12-16 23:10:50.305: E/AndroidRuntime(1272): 在 android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3632) 12-16 23:10:50.305: E/AndroidRuntime(1272): 在 android.app.ActivityThread.handleStopActivity(ActivityThread.java:3677)
【问题讨论】:
Logcat 崩溃时会说什么? 添加了上面的 Logcat。有什么想法吗? 【参考方案1】:当它是一个位置监听器时,你向一个监听器投射:
声明:
LocationListener mlocListener;
实例化:
mlocListener = new MyLocationListener();
演员:
(Listener) mlocListener
Yout Logcat 在这里解释:
java.lang.ClassCastException: com.dummies.android.taskreminder.MyLocationListener 12-16
【讨论】:
好的,但是该方法需要一个监听器,如果我不重铸它会出现错误。我可以使用其他方法来接受 LocationListener 吗? 我试过了,但总是崩溃:***.com/questions/6894234/… 使用 removeUpdates 那么你的 logcat 会说什么。你真的需要习惯阅读你的 logcat 来调试你的错误,而不是仅仅说“它崩溃了” 会的,上面还添加了 LogCat 信息。活动无法停止? 只需调用 super.onStop();在 onStop() 方法的最后一行,logcat 说明了一切!【参考方案2】:尝试覆盖 finish()
而不是 `onStop()' 对于初学者
我做的另一件事是在获得onLocationChanged()
的位置后将gpslistener 设置为null,最后,如果您需要继续获取位置更新,那么您应该考虑创建服务,而不是执行gps活动中的监听器。
这样你可以更容易地终止服务,这将终止监听器
【讨论】:
我已将 'onStop' 方法更改为:@Override public void finish() //mlocManager.removeUpdates(mlocListener); mlocListener = null; mlocManager = null; 但 GPS 传感器现在保持开启状态 哇,不要覆盖完成,覆盖 onPause 或 onStop ,根据您想要停止收听的活动生命周期中的哪个位置。覆盖完成仅适用于您明确完成活动时,而不是像大多数情况一样切换活动时。 @Blundell,文档警告不要使用 onStop,因为它可能并不总是被调用。 onPause 更好。他说,如果他退出应用程序,他会试图停止,而不仅仅是切换活动。 finish() 是合适的 @CQM finish() 在使用返回按钮退出活动时不会被调用。同意他应该使用 onPause 我在上面添加了一些代码,但是当我离开主要活动时传感器停止侦听。除了将上述代码添加到我的所有活动之外,你能想出一个更好的方法来让它一直运行直到我离开应用程序吗?【参考方案3】:目前这似乎工作得相当好,但可能有更好的方法(后台线程.....):
@Override
public void onDestroy()
mlocManager.removeUpdates(mlocListener);
super.onDestroy();
@Override
public void onResume()
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
super.onResume();
【讨论】:
以上是关于让我的 GPS 传感器停止时遇到一些问题的主要内容,如果未能解决你的问题,请参考以下文章