Android 为什么警报会出现此错误?

Android 为什么警报会出现此错误?,android,gps,Android,Gps,我正在构建一个android应用程序,我在其中使用位置。我的位置在服务中实现。当用户登录时,若他并没有打开GPS,他会收到警报对话框。但是,当我注销并再次进入LoginActivity(我的启动程序活动是MainActivity,GPS的此功能在MainActivity的onCreate方法中)时,我的应用程序崩溃。 这是我的职责: public void alertForEnablingGPS(){ LocationManager lm = (LocationManager

我正在构建一个android应用程序,我在其中使用位置。我的位置在服务中实现。当用户登录时,若他并没有打开GPS,他会收到警报对话框。但是,当我注销并再次进入LoginActivity(我的启动程序活动是MainActivity,GPS的此功能在MainActivity的onCreate方法中)时,我的应用程序崩溃。 这是我的职责:

 public  void alertForEnablingGPS(){
        LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
                !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            // Build the alertForEnablingGPS dialog
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Location Services Not Active");
            builder.setMessage("Please enable Location Services and GPS");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i) {
                    // Show location settings when the user acknowledges the alertForEnablingGPS dialog
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivity(intent);
                }
            });
            Dialog alertDialog = builder.create();
            alertDialog.setCanceledOnTouchOutside(false);
            alertDialog.show();
        }} 
这是我的错误:

09-14 14:19:43.680 7188-7188/com.telnet.asp E/AndroidRuntime: FATAL EXCEPTION: main
                                                          java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
                                                              at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:114)
                                                              at android.os.Handler.handleCallback(Handler.java)
                                                              at android.os.Handler.dispatchMessage(Handler.java)
                                                              at android.os.Looper.loop(Looper.java)
                                                              at android.app.ActivityThread.main(ActivityThread.java)
                                                              at java.lang.reflect.Method.invokeNative(Native Method)
                                                              at java.lang.reflect.Method.invoke(Method.java:525)
                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
                                                              at dalvik.system.NativeStart.main(Native Method)
                                                           Caused by: rx.exceptions.OnCompletedFailedException: Unable to add window -- token android.os.BinderProxy@42c55580 is not valid; is your activity running?
                                                              at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:90)
                                                              at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:284)
                                                              at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:219)
                                                              at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
                                                              at android.os.Handler.handleCallback(Handler.java) 
                                                              at android.os.Handler.dispatchMessage(Handler.java) 
                                                              at android.os.Looper.loop(Looper.java) 
                                                              at android.app.ActivityThread.main(ActivityThread.java) 
                                                              at java.lang.reflect.Method.invokeNative(Native Method) 
                                                              at java.lang.reflect.Method.invoke(Method.java:525) 
                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
                                                              at dalvik.system.NativeStart.main(Native Method) 
                                                           Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@42c55580 is not valid; is your activity running?
                                                              at android.view.ViewRootImpl.setView(ViewRootImpl.java)
                                                              at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)
                                                              at android.view.WindowManagerImpl.addView(WindowManagerImpl.java)
                                                              at android.app.Dialog.show(Dialog.java)
                                                              at com.telnet.asp.presentation.view.activities.MainActivity.alertForEnablingGPS(MainActivity.java:385)
                                                              at com.telnet.asp.presentation.view.activities.MainActivity.viewAccount(MainActivity.java:142)
                                                              at com.telnet.asp.presentation.presenter.AccountPresenter.showAccountInView(AccountPresenter.java:44)
                                                              at com.telnet.asp.presentation.presenter.AccountPresenter.access$000(AccountPresenter.java:15)
                                                              at com.telnet.asp.presentation.presenter.AccountPresenter$AccountSubscriber.onCompleted(AccountPresenter.java:66)
                                                              at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:84)
                                                              at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:284) 
                                                              at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:219) 
                                                              at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107) 
                                                              at android.os.Handler.handleCallback(Handler.java) 
                                                              at android.os.Handler.dispatchMessage(Handler.java) 
                                                              at android.os.Looper.loop(Looper.java) 
                                                              at android.app.ActivityThread.main(ActivityThread.java) 
                                                              at java.lang.reflect.Method.invokeNative(Native Method) 
                                                              at java.lang.reflect.Method.invoke(Method.java:525)
我该怎么做才能解决这个问题? 提前谢谢

编辑:当我使用Rushi的答案时,我得到以下错误:

09-14 15:03:11.346 10896-10896/com.telnet.asp E/WindowManager: Activity com.telnet.asp.presentation.view.activities.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42defcf8 V.E..... R.....ID 0,0-720,351} that was originally added here
                                                               android.view.WindowLeaked: Activity com.telnet.asp.presentation.view.activities.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42defcf8 V.E..... R.....ID 0,0-720,351} that was originally added here
                                                                   at android.view.ViewRootImpl.<init>(ViewRootImpl.java)
                                                                   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)
                                                                   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java)
                                                                   at android.app.Dialog.show(Dialog.java)
                                                                   at com.telnet.asp.presentation.view.activities.MainActivity.alertForEnablingGPS(MainActivity.java:392)
                                                                   at com.telnet.asp.presentation.view.activities.MainActivity.viewAccount(MainActivity.java:143)
                                                                   at com.telnet.asp.presentation.presenter.AccountPresenter.showAccountInView(AccountPresenter.java:44)
                                                                   at com.telnet.asp.presentation.presenter.AccountPresenter.access$000(AccountPresenter.java:15)
                                                                   at com.telnet.asp.presentation.presenter.AccountPresenter$AccountSubscriber.onCompleted(AccountPresenter.java:66)
                                                                   at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:84)
                                                                   at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:284)
                                                                   at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:219)
                                                                   at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
                                                                   at android.os.Handler.handleCallback(Handler.java)
                                                                   at android.os.Handler.dispatchMessage(Handler.java)
                                                                   at android.os.Looper.loop(Looper.java)
                                                                   at android.app.ActivityThread.main(ActivityThread.java)
                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                   at java.lang.reflect.Method.invoke(Method.java:525)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
                                                                   at dalvik.system.NativeStart.main(Native Method)
09-14 15:03:11.346 10896-10896/com.telnet.asp E/WindowManager:Activity com.telnet.asp.presentation.view.activities.main活动泄漏了最初添加到此处的window com.android.internal.policy.impl.PhoneWindow$DecorView{42defcf8 V.E..R..ID 0-720351}
android.view.WindowLeaked:Activity com.telnet.asp.presentation.view.activities.MainActivity已泄漏最初添加到此处的window com.android.internal.policy.impl.PhoneWindow$DecorView{42defcf8 V.E..R..ID 0,0-720351}
在android.view.ViewRootImpl.(ViewRootImpl.java)
在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java)中
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java)中
在android.app.Dialog.show(Dialog.java)上
位于com.telnet.asp.presentation.view.activities.MainActivity.AlertForEnableGPS(MainActivity.java:392)
在com.telnet.asp.presentation.view.activities.MainActivity.viewAccount(MainActivity.java:143)上
在com.telnet.asp.presentation.presenter.AccountPresenter.showAccountInView(AccountPresenter.java:44)上
在com.telnet.asp.presentation.presenter.AccountPresenter.access$000(AccountPresenter.java:15)
位于com.telnet.asp.presentation.presenter.AccountPresenter$AccountSubscriber.onCompleted(AccountPresenter.java:66)
在rx.observators.SafeSubscriber.onCompleted(SafeSubscriber.java:84)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:284)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:219)
在rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
位于android.os.Handler.handleCallback(Handler.java)
位于android.os.Handler.dispatchMessage(Handler.java)
位于android.os.Looper.loop(Looper.java)
位于android.app.ActivityThread.main(ActivityThread.java)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
在dalvik.system.NativeStart.main(本机方法)
将这个单独的类放在您想要使用的地方,初始化这个类的对象,并在您的登录活动中编写这行代码。试试这个,让我知道

GPSTracker gps;
 gps= new GPSTracker(this);
 if (gps.canGetLocation()) {
                    gps= new GPSTracker(Activity.this);
                    latitude = gps.getLatitude();
                    longitude = gps.getLongitude();                 
                }else{
                    gps.showSettingsAlert();
                }

如果您从后台线程显示对话框,并且您的活动已被销毁,则会出现此错误, 在这里找到如何从后台线程处理对话框


您是否尝试过此方法?请稍候,在另一条评论中向您发送另一个解决方案。我已更改了此解决方案,如果它适合您,请尝试此方法。让我知道这一点我不必这样做,因为我有服务的位置,是寻找纬度和经度,我只需要警报对话框,这就是你可以从这里选择showSettingsAlert();代码。此代码也在执行您想要的操作。请在显示对话框时在活动中尝试此操作,
如果(!isFinishing()){alert.show();}
嘿,请在MainActivity上延迟一段时间后尝试显示您的对话框。崩溃报告显示了一些与上下文引用相关的问题,但在您的代码中,您以正确的方式编写了它。所以,只要尝试使用处理程序在延迟后调用这个函数。我已经编辑了这个问题,请看一看。
GPSTracker gps;
 gps= new GPSTracker(this);
 if (gps.canGetLocation()) {
                    gps= new GPSTracker(Activity.this);
                    latitude = gps.getLatitude();
                    longitude = gps.getLongitude();                 
                }else{
                    gps.showSettingsAlert();
                }