Java 为什么getcontext()只在一个方法中为null?
您好,我正在制作一个地图应用程序,它位于Android Studio的抽屉活动中,一切都进行得很顺利,直到我开始玩碎片,因为我是Android新手,我真的不知道发生了什么,也不知道问题的原因是什么 我将主布局替换为地图布局,使其成为我的“家”布局。然后我添加了一个片段,我可以在其中更改应用程序的语言“配置”,当按下抽屉菜单上的“配置”按钮时,我调用该片段 我注意到,尽管配置片段替换了地图布局,但地图片段中的一些位置方法在后台仍处于活动状态,我知道这一点,因为每次应用程序检查权限或更改位置时,都会显示一条Toast消息。我这样做是为了直观地了解它的工作情况 有两种情况下,我的应用程序因同一行代码中的同一错误而崩溃,而这恰好是我在那里作为帮助的祝酒词之一。这对我来说很奇怪,因为所有其他toast都工作正常,因为消息正在显示,但当它在onLocationChanged方法中到达特定toast时,下一个错误将显示:Java 为什么getcontext()只在一个方法中为null?,java,android,google-maps,android-fragments,drawerlayout,Java,Android,Google Maps,Android Fragments,Drawerlayout,您好,我正在制作一个地图应用程序,它位于Android Studio的抽屉活动中,一切都进行得很顺利,直到我开始玩碎片,因为我是Android新手,我真的不知道发生了什么,也不知道问题的原因是什么 我将主布局替换为地图布局,使其成为我的“家”布局。然后我添加了一个片段,我可以在其中更改应用程序的语言“配置”,当按下抽屉菜单上的“配置”按钮时,我调用该片段 我注意到,尽管配置片段替换了地图布局,但地图片段中的一些位置方法在后台仍处于活动状态,我知道这一点,因为每次应用程序检查权限或更改位置时,都会
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.widget.Toast.<init>(Toast.java:114)
at android.widget.Toast.makeText(Toast.java:277)
at android.widget.Toast.makeText(Toast.java:267)
at com.tesseract.psiclops.zerov2.mapFragment.onLocationChanged(mapFragment.java:172)
at com.google.android.gms.internal.location.zzay.notifyListener(Unknown Source:4)
at com.google.android.gms.common.api.internal.ListenerHolder.notifyListenerInternal(Unknown Source:8)
at com.google.android.gms.common.api.internal.ListenerHolder$zza.handleMessage(Unknown Source:16)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
mapfragment方法中的所有其他祝酒词都工作正常
如果你需要更多的代码,请在这里问我,我会为你添加它。提前非常感谢 在片段中声明上下文变量
private Context mContext;
从onAttach()初始化它
}
敬酒
Toast.makeText(mContext,getString(R.string.toast) , Toast.LENGTH_LONG).show();
getContext()
仅当片段附加到其包含活动时返回非空值-介于onAttach()
和onDetach()之间。如果回调发生在这些事件之外,那么您没有适当地清理侦听器
您最早应该创建侦听器(即调用requestLocationUpdates()
)的是onAttach()
然后必须在ondeach()
中注销侦听器(即调用),以防止泄漏LocationListener和整个片段
通常,只有在屏幕上可以看到片段时,才应该请求更新。在这种情况下,您将在onStart()
中注册,并在onStop()中注销这些代码是否真的是重现问题所必需的?请阅读,在最小的压力。可能重复的哦对不起,我只是想在这里有所有的信息,我会编辑,然后添加更多的代码,如果有人要求我,谢谢!我想你误解了我的评论。您的代码仍然需要完成。这一编辑实际上让情况变得更糟,因为现在已经完全没有任何关于正在发生什么的信息了。请仔细阅读,并创建一个实际最小且完整的示例。基本上,我们希望您完成调试代码的基础工作,并将问题缩小到重现代码所需的绝对最小值。我的建议是创建一个新项目,并添加/删除部分代码,直到可以用最少的代码重现问题。原因有二:一,。通过这样做,你很有可能自己找到原因和解决方案。2.当用这样一个缩小的例子发布一个问题时,其他用户也不必做基础工作,这样可以更快更有效地帮助你。哇,你做到了!现在可以工作了!!你能解释一下为什么会这样吗?我是否应该将所有的“getcontext()”改为一个变量?片段的生命周期工作方式不同,要获得执行此操作或调用getApplicationContext()所需的上下文,您可以接受我的答案,如果它对您有效。如果这对您有效,那么你完全是在泄露你的上下文,让你的LocationListener比你的片段存活的时间更长。我会接受它,尽管我仍然怀疑为什么那个特定的toast会崩溃,而不是其他的….@ianhanniballake我想我完全是在这样做,你能给我指出一些我可以阅读的文档来避免这种情况吗?或者你愿意解释一下吗?这里没什么,谢谢!非常感谢你!这给了我更多的视角,我想我知道如何寻找我现在需要的信息,谢谢!
private Context mContext;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
Toast.makeText(mContext,getString(R.string.toast) , Toast.LENGTH_LONG).show();