【问题标题】:Waiting the methods' outputs to start an Activity等待方法的输出以启动 Activity
【发布时间】:2019-02-04 17:05:30
【问题描述】:

我有一个名为 getLocation() 的方法,它可以通过 FusedLocationClient 找到当前设备的位置。调用此方法后,我得到找到的位置的纬度和经度,并使用 putExtra 将这些值传递给另一个 Activity。在 getLocation() 中,我有一个显示经纬度的 Toast,并且我收到了正确的位置。在活动中,我有另一个 Toast 显示我从 MainActivity 发送的纬度和经度值,但结果是纬度和经度均为空。如果我回去并重新开始活动,我得到的纬度和经度不是空值。有什么想法吗?

其他代码:

case R.id.nearYou:
            i = new Intent(MainActivity.this, Ricerca1.class);
            if (!isGPS) {
                Toast.makeText(this, "Please turn on GPS", 
Toast.LENGTH_SHORT).show();
                return;
            }
            isContinue = false;
            getLocation();

            latitudine = wayLatitude.toString();
            longitudine = wayLongitude.toString();


            i.putExtra("latPar", longitudine);
            i.putExtra("lonPar", latitudine);
            i.putExtra("radiusPar", "0.5");
            i.putExtra("categoryPar", "Museum;Botanical_and_zoological_gardens;Churches;Cultural_centre;Cultural_sites;Historical_buildings;Library;Monument_location;Photographic_activities;Squares;Theatre;");
            startActivity(i);

            break; 

获取位置:

private void getLocation() {
    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                AppConstants.LOCATION_REQUEST);

    } else {
        if (isContinue) {
            mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
        } else {
            mFusedLocationClient.getLastLocation().addOnSuccessListener(MainActivity.this, location -> {
                if (location != null) {
                    wayLatitude = location.getLatitude();
                    wayLongitude = location.getLongitude();
                    Toast.makeText(MainActivity.this,String.format(Locale.US, "%s - %s", wayLatitude, wayLongitude), Toast.LENGTH_SHORT).show();

                } else {
                    mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                }
            });
        }
    }

}

【问题讨论】:

  • getLocation() 是否执行任何异步工作?可能wayLatitudewayLongitude 还没有初始化。
  • @BenP。抱歉,我添加了 getLocation 方法...wayLatitude 和 wayLongitude 被声明为 private Double = 0.0;

标签: android android-activity methods


【解决方案1】:

您应该在 getLocation() 中的 Toast 消息之后启动Activity。

为什么?

因为,getLocation 等待监听器完成(addOnSuccessListener)而你在完成之前启动activity。

您的代码将是:

    private void getLocation() {
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    AppConstants.LOCATION_REQUEST);

        } else {
            if (isContinue) {
                mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
            } else {
                mFusedLocationClient.getLastLocation().addOnSuccessListener(MainActivity.this, location -> {
                    if (location != null) {
                        wayLatitude = location.getLatitude();
                        wayLongitude = location.getLongitude();
                        Toast.makeText(MainActivity.this,String.format(Locale.US, "%s - %s", wayLatitude, wayLongitude), Toast.LENGTH_SHORT).show();

                        //Code from OTHER CODE
                        latitudine = wayLatitude.toString();
                        longitudine = wayLongitude.toString();

                        i.putExtra("latPar", longitudine);
                        i.putExtra("lonPar", latitudine);
                        i.putExtra("radiusPar", "0.5");

                        i.putExtra("categoryPar", "Museum;Botanical_and_zoological_gardens;Churches;Cultural_centre;Cultural_sites;Historical_buildings;Library;Monument_location;Photographic_activities;Squares;Theatre;");

                        startActivity(i);

                    } else {
                        mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                    }
                });
            }
        }

    }

【讨论】:

  • 我这样做是因为我在 switch 中有 4 个 case,我在其中两个中使用 get Location
  • 您可以在getLocation中使用这两种情况之间的测试。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多