java - Android应用程序模块化(类)

标签 java android class nullreferenceexception

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

很长一段时间以来,我一直在创建很长的 Android Activity ,只是因为我不太了解类及其工作原理。本周早些时候,我了解到在方法之间发送信息是多么容易。今天,我正在努力在类(class)之间发送信息。我不想用一页很长的代码来筛选,我想将其分解为多个 block ,并进行信息引用并相互交互。这样可以更轻松地保持我的代码组织和更快地做出改变。我尝试从主线程中删除两个单独的类,并在同一目录中创建它们,代码没有显示任何错误,因此它们应该可以正常执行。然而,我在某些地方弄乱了上下文。我也没有完全理解上下文的概念。我有一个类用来获取我的手机位置,另一个类要上传到我的服务器。在尝试执行时,这些类都会返回 null 值。然而,当它在一项主要 Activity 上全部简化时,没有出现空错误。我一直在阅读上下文是这里的问题。

我已经从我的主线程引用了其他类,如下所示:

    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();
}

我的位置类如下所示:

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();
    }

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

错误:

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,并且作为另一个类,上下文是不同的。

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

希望这有帮助。

关于java - Android应用程序模块化(类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39029217/

相关文章:

c++ - 使用指针从 for_each 循环访问成员方法

c# - 可以创建不区分大小写的字符串类吗?

java - 将多个参数发送到不同类型的 reducer

java - 如何让 JFrame 自动调整大小以显示所有按钮

android - 如何在Android中同时录制声音和读取声音

android - 如何通过 adb android 更改首选网络类型?

java - 我们可以直接实例化一个抽象类吗?

java - java中一个类的对象在2个不同的JVM上的序列化

java - 多线程(即基于线程池的)Java 应用程序的损坏结果

android - 如何切换到 Android Studio 中的图形编辑器?