Android 应用程序模块化 (类)

Android app modulization (classes)

感谢您花时间加载我的 post 并查看我的问题。

我创建长 android 活动的时间最长,只是因为我不太了解 classes 及其工作原理。本周早些时候,我了解了在方法之间发送信息是多么容易。今天,我正在努力在 class 之间发送信息。 我不想让一页很长的代码来筛选,而是想把它分解成块,让信息参考并与彼此互动。这样更容易保持我的代码井井有条,可以更快地进行更改。我试图从我的主线程中删除两个单独的 classes 并在同一目录中创建它们,代码没有显示错误,因此它们应该可以正常执行。但是,我在上下文的某个地方搞砸了。我也不完全理解上下文的概念。我有一个 class 用于获取我的手机位置,另一个 class 用于上传到我的服务器。 这些 class 都是 return 空值 试图执行时。但是,当它在一个主 activity 上全部流线时,没有空错误。我一直在阅读上下文是这里的问题。

我已经从我的主线程中引用了其他 classes:

    LocationClass LocationClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mapfrag);
    LocationClass = new LocationClass();


@Override
public void onMapReady(GoogleMap googleMap) {
    Map = googleMap;
    Map.setOnMapClickListener(this);
    Map.setOnMapLongClickListener(this);
    Map.setMapType(1);
    Map.setOnMarkerClickListener(this);
    LocationClass.GETLOCATION();
}

我的位置 class 看起来像这样:

public class LocationClass extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000;
    private Location mLastLocation;
    private GoogleApiClient mGoogleApiClient;
    public LatLng reallifelocation;
    public static final String userdata = "userdata";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (checkPlayServices()) {
            buildGoogleApiClient();
        }
        check_perms();
    }

然后它会检查权限并执行获取位置所需的操作。这段代码已经过测试并在主线程中运行,我只是想为它创建自己的 class

错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                   at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:112)
                                                                   at biz.tanners.geo_x.LocationClass.GETLOCATION(LocationClass.java:49)

错误所在(LocationClass.java):

public void GETLOCATION() {
    if (ActivityCompat.checkSelfPermission(this.getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}
    final SharedPreferences prefs = getSharedPreferences(userdata, MODE_PRIVATE);
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) {
        reallifelocation = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
    }
    //add to prefs or offline db
}

你的错误源于这里

 if (ActivityCompat.checkSelfPermission(
    this.getApplicationContext(), 
        android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}

这里this大概应该对应Context,而另一个class,context是不一样的。

快速解决方法是将 Activity 的上下文作为参数传递给 LocationClass 的对象。通过将它添加到构造函数中并将其分配给正确的变量,稍后您可以使用它来代替 this.

希望对您有所帮助。