Android - 从任何课程获取位置

时间:2015-04-20 13:51:53

标签: java android static

我有以下代码。这是我使用Map片段的类,但我需要在其他类中使用这些方法。

public class FragmentMap extends Fragment {
private LocationManager locationManager;
private Location myLocation;

private Location getBestLocation() {
    Location gpslocation     = getLocationByProvider(LocationManager.GPS_PROVIDER);
    Location networkLocation =
            getLocationByProvider(LocationManager.NETWORK_PROVIDER);

    if (gpslocation == null) {
        return networkLocation;
    }
    if (networkLocation == null) {
        return gpslocation;
    }

    long old = System.currentTimeMillis() - 1000;
    boolean gpsIsOld = (gpslocation.getTime() < old);
    boolean networkIsOld = (networkLocation.getTime() < old);

    if (!gpsIsOld) {
        return gpslocation;
    }

    if (!networkIsOld) {
        return networkLocation;
    }

    if (gpslocation.getTime() > networkLocation.getTime()) {
        return gpslocation;
    } else {
        return networkLocation;
    }
}

private Location getLocationByProvider(String provider) {
    Location location = null;

    locationManager = (LocationManager) getActivity().getApplicationContext()
            .getSystemService(Context.LOCATION_SERVICE);
    try {
        if ( locationManager.isProviderEnabled(provider) ) {
            location = locationManager.getLastKnownLocation(provider);
        }
    } catch (IllegalArgumentException e) {
        Log.d("FragmentMap", "Cannot access Provider " + provider);
    }
    return location;
}
public String getCity(){
    String result = "";
    Geocoder gcd = new Geocoder(getActivity(), Locale.getDefault());
    try {
        List<Address> addresses = gcd.getFromLocation(myLocation.getLatitude(), myLocation.getLongitude(), 1);
        if (addresses.size() > 0){
                result = addresses.get(0).getLocality();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}
}

我需要在3个班级中使用它。如何编写一次并在任何地方使用它,所以我不必在每个类中复制它。据我所知,我应该使用public static。但是java并不允许我这样做。 我想看看实现这类事情的最佳实践是什么。 谢谢。

4 个答案:

答案 0 :(得分:2)

首先,您似乎没有定义类。即使您只需要静态方法,也必须创建一个类:

public class MyClass {
  [...]
}

现在,您在此处使用非静态属性:

private Location myLocation;

所以你不能在静态方法中使用它。

  • 您可以定义此属性以及将其用作静态的方法
  • 或者您将属性和方法声明为非静态。

问问自己将此属性设置为非静态是否有意义(它是否依赖于类实例,还是应该由所有实例共享?)

如果您选择非静态选项,它将变为:

public class MyClass {
  //Useless because you are only using a static field of this class.
  //private LocationManager locationManager;

  //Static attributes must be named with UPPER CASE letters
  private static Location MY_LOCATION;

  private static Location getBestLocation() {

  private static Location getLocationByProvider(String provider) {
    ...
  }

  public static String getCity(){
    ...
  }
}

答案 1 :(得分:0)

有几种方法:

a)您可以使用类来访问公共静态方法。不确定你为什么要面对它的问题

b)您可以在清单中声明一个应用程序类,并在应用程序类中添加这些方法。可以从所有活动和片段访问应用程序类。有关应用程序类的更多详细信息,请访问http://developer.android.com/reference/android/app/Application.html

c)您可以声明一个扩展Activity类的基类,并在此处添加您的方法。稍后,您可以通过扩展此基类来创建所有新活动,从而可以访问这些位置检索方法。这样甚至片段都可以访问这些方法。

答案 2 :(得分:0)

您可能错过了基类...

示例:

class myLocationClass {

public static Location getBestLocation() {..}
public static Location getLocationProvider() {...}

public static String getCity {...}

}

然后直接通过该类使用: myLocationClass.getBestLocation()myLocationClass.getLocationProvider()myLocationClass.getCity

答案 3 :(得分:0)

有几种方法可以解决这个问题。 Application类是一个单例,因此您可以在那里使用公共方法,并从可以获得Context的任何位置访问它。更好的方法是使用像Otto这样的总线,并在您希望提供位置更新的位置订阅它。