【问题标题】:Having some trouble getting my GPS sensor to stop让我的 GPS 传感器停止时遇到一些问题
【发布时间】: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。有什么想法吗?

标签: android gps


【解决方案1】:

当它是一个位置监听器时,你向一个监听器投射:

声明:

 LocationListener mlocListener; 

实例化:

 mlocListener = new MyLocationListener();

演员:

 (Listener) mlocListener

Yout Logcat 在这里解释:

java.lang.ClassCastException: com.dummies.android.taskreminder.MyLocationListener 12-16

【讨论】:

  • 好的,但是该方法需要一个监听器,如果我不重铸它会出现错误。我可以使用其他方法来接受 LocationListener 吗?
  • 我试过了,但总是崩溃:stackoverflow.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();
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多