我试图获取用户的位置,这似乎给我带来了麻烦。
当我调用distanceBetween()
来查看测试是否有效时,我在getApplicationContext()
得到一个NullPointerException。有什么我不做的吗?
这是Stacktrace:
java.lang.NullPointerException at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 在 com.ayy.zz.DistanceFinder.onCreate(DistanceFinder.java:38) 在 com.ayy.zz.DistanceFinder.distanceBetween(DistanceFinder.java:82) 在 com.ayy.zz.DistanceFinderTests.testSomething(DistanceFinderTests.java:14) 在java.lang.reflect.Method.invokeNative(Native Method)at student.TestCase.runBare(TestCase.java:108)at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) 在 android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1701)
TestSomething只是初始化DistanceFinder并调用distanceBetween方法:
public double distanceBetween()
{
onCreate();
return dining1.distanceTo(dining2);
}
答案 0 :(得分:2)
您不能简单地调用onCreate
来获取上下文。目前还不清楚你要做什么或何时打电话distanceBetween
,但显然是在Android"创建"之前。活动。 (What is 'Context' on Android?)
此外,您的mContext
不应该是静态的,虽然这是允许的,但即使未创建实例,也可以访问变量,同时也为您提供NPE。
当您访问Context
时,您需要确保Android实际创建/传递了对象的上下文。在这种情况下,必须启动活动"在它有上下文之前。对于Service
和BroadcastReceiver
类也是如此。
以下是获得Context
-
public double distanceBetween(Context mContext) { locationManager = (LocationManager) mContext .getSystemService(Context.LOCATION_SERVICE); dining1 = new Location(""); dining1.setLatitude(37.226500); dining1.setLongitude(-80.419179); dining2 = new Location(""); dining2.setLatitude(37.229219); dining2.setLongitude(-80.418310); return dining1.distanceTo(dining2); }
仅在Android创建活动后调用您的方法(而不是通过调用onCreate()
创建Service
并将您的请求传递给服务并使用其Context
http://www.vogella.com/tutorials/AndroidServices/article.html
Application
类,只要您的应用运行,就可以访问该类。