【问题标题】:Certain piece of code do not get executed even after all the conditions are true. Please see details即使在所有条件都为真之后,某些代码也不会被执行。请查看详情
【发布时间】:2016-08-11 11:26:31
【问题描述】:

我正在开发一个应用程序并使用以下代码获取用户的当前坐标(来自this 库):

   ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
          locationProvider.getLastKnownLocation().subscribe(new Action1<Location>() {
                  @Override
                  public void call(Location location) {
                  currentLatDouble = location.getLatitude();
                  currentLngDouble = location.getLongitude();
                  Toast.makeText(getBaseContext(), "User's location retrieved using library for android M in btnRetryGpsEvents()", Toast.LENGTH_SHORT).show();
                }
          });

问题在于,即使在所有条件都为真之后,这段代码有时甚至都不会被执行。请看下面的代码:

    if (currentLatDouble != null || currentLngDouble != null) {
            retrieveHWrapper();
            progressBarLoadingRequests.setVisibility(View.VISIBLE);
            btnRetryGps.setVisibility(View.INVISIBLE);
            gps_off.setVisibility(View.INVISIBLE);
            Toast.makeText(getBaseContext(), "Loading hrequests...", Toast.LENGTH_LONG).show();
         } else {
            gps_off.setVisibility(View.VISIBLE);
            progressBarLoadingRequests.setVisibility(View.INVISIBLE);
            btnRetryGps.setVisibility(View.VISIBLE);
            btnRetryGps.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                btnRetryGpsEvents();
                int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_SETTINGS);
                                    if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
                                        if (ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_SETTINGS) != PackageManager.PERMISSION_GRANTED) {
                                            // TODO: Consider calling
                                            //    ActivityCompat#requestPermissions
                                            // here to request the missing permissions, and then overriding
                                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                            //                                          int[] grantResults)
                                            // to handle the case where the user grants the permission. See the documentation
                                            // for ActivityCompat#requestPermissions for more details.
                                            if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_SETTINGS)) {
                                                showMessageOKCancel("You need to allow access to few permissions so that the app can work as expected.",
                                                        new DialogInterface.OnClickListener() {
                                                            @Override
                                                            public void onClick(DialogInterface dialog, int which) {
                                                                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_SETTINGS},
                                                                        REQUEST_RUNTIME_PERMISSION);
                                                            }
                                                        });
                                                return;
                                            }
                                            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_SETTINGS},
                                                    REQUEST_RUNTIME_PERMISSION);
                                            return;
                                        }
                                    }

                                    ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext());
                                    locationProvider.getLastKnownLocation()
                                            .subscribe(new Action1<Location>() {
                                                @Override
                                                public void call(Location location) {
                                                    currentLatDouble = location.getLatitude();
                                                    currentLngDouble = location.getLongitude();
                                                    Toast.makeText(getBaseContext(), "User's location retrieved using library for android M in btnRetryGpsEvents()", Toast.LENGTH_SHORT).show();
                                                }
                                            });
                                    Toast.makeText(getBaseContext(), "called from btnRetryGpsEvents() - GPS available", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

运行上面的代码后,由于这段代码的 toast 显示:Toast.makeText(getBaseContext(), "called from btnRetryGpsEvents() - GPS available", Toast.LENGTH_SHORT).show();,这意味着它正在被执行,但它上面的 toast 即:Toast.makeText(getBaseContext(), "User's location retrieved using library for android M in btnRetryGpsEvents()", Toast.LENGTH_SHORT).show(); 没有显示,这意味着它没有被执行!

这怎么会发生?这是怎么回事????

请告诉我。

P.S.:此问题仅在 Android M 及以上版本中出现。

【问题讨论】:

  • 它上面的 toast 在一个接口方法中。我相信只有在回调到达时才会调用它
  • @Shaishav 你到底是什么意思?此代码是否需要时间返回位置?我应该怎么做才能确保必须检索一些经纬度?
  • 是的...我什至不知道那个界面,所以我无法评论如何让它变得更快。但是,请注意,它只会在回调到达时被调用。如果您想在任何情况下显示它,请将其放在接口方法之外(就像您的其他吐司一样)
  • 哈哈.. 我的主要目的不是显示Toast。就是获取坐标。有没有更好的方法?
  • 我相信这需要一些时间。我不知道您的用例,但我有一种感觉,如果您也将另一个 toast 移动到方法中,它们只会在合法数据出现时一个接一个地出现(假设这是您的用户想要的)

标签: android gps android-6.0-marshmallow runtime-permissions android-reactivelocation


【解决方案1】:

请检查 ReactiveLocationProvider 中的代码。我认为它实现了 LocationListener。猜测 getLastLocation 在里面调用。只有当最后一个位置可用时,它才会给出位置。或者请提供代码以便我们检查。

【讨论】:

  • 这是我正在使用的库:github.com/mcharmas/Android-ReactiveLocation
  • 我发现它在 M 设备上运行良好。您正在测试的特定设备可能有问题或没有最后一个已知位置。您可能无法立即获得位置,因为它是以这种方式设计的。所以改变你的设计并处理这种情况。
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多