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
.
希望对您有所帮助。
感谢您花时间加载我的 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
.
希望对您有所帮助。