Luk*_*kap 182 null android android-context android-fragments android-activity
我有一个像这样的公共方法的片段(F1)
public void asd() {
if (getActivity() == null) {
Log.d("yes","it is null");
}
}
Run Code Online (Sandbox Code Playgroud)
是的,当我调用它(来自Activity)时,它是null ...
FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction();
F1 f1 = new F1();
transaction1.replace(R.id.upperPart, f1);
transaction1.commit();
f1.asd();
Run Code Online (Sandbox Code Playgroud)
它一定是我做错了,但我不知道那是什么
PJL*_*PJL 162
commit
调度事务,即它不会立即发生,而是在下一次主线程准备好时安排在主线程上工作.
我建议添加一个
onAttach(Activity activity)
Run Code Online (Sandbox Code Playgroud)
你的方法,Fragment
并在它上面设置一个断点,并查看它相对于你的呼叫被调用的时间asd()
.您将看到在调用asd()
退出的方法之后调用它.该onAttach
呼叫在Fragment
连接到它的活动,从这个角度getActivity()
将返回非空(NB也有一个onDetach()
呼叫).
Paw*_*ari 91
最好摆脱这个是在调用onAttach时保持活动参考,并在需要的地方使用活动参考,例如
@Override
public void onAttach(Context context) {
super.onAttach(activity);
mContext = context;
}
@Override
public void onDetach() {
super.onDetach();
mContext = null;
}
Run Code Online (Sandbox Code Playgroud)
thu*_*yen 77
当您getActivity()
在删除片段后调用另一个完成的线程时,会发生这种情况.典型的情况是在HTTP请求完成时调用getActivity()
(例如,用于a Toast
)(onResponse
例如).
为避免这种情况,您可以定义字段名称mActivity
而不是使用它getActivity()
.该字段可以在Fragment的onAttach()方法中初始化,如下所示:
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Activity){
mActivity =(Activity) context;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我通常使用此功能为我的所有片段定义基类:
public abstract class BaseFragment extends Fragment {
protected FragmentActivity mActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof Activity){
mActivity =(Activity) context;
}
}
}
Run Code Online (Sandbox Code Playgroud)
快乐的编码,
mig*_*uel 22
其他答案表明在onAttach中保留对活动的引用只是建议对真正的问题进行绑定.当getActivity返回null时,表示Fragment未附加到Activity.最常见的情况是,当Activity因旋转或Activity完成而消失时,会发生这种情况,但Fragment具有某种回调侦听器.如果您需要对Activity执行某些操作但是Activity已经消失,那么当调用者被调用时,您无能为力.在您的代码中,您应该检查getActivity() != null
,如果它不存在,那么不要做任何事情.如果您保留对活动的引用,那么您将阻止活动被垃圾回收.用户不会看到您可能尝试执行的任何UI操作.我可以想象一些情况,在回调监听器中你可能想要一个非UI相关的上下文,在这种情况下,获取Application上下文可能更有意义.请注意,onAttach
诀窍不是大内存泄漏的唯一原因是因为通常在回调侦听器执行之后它将不再需要,并且可以与Fragment,其所有View和Activity上下文一起被垃圾收集.如果你setRetainInstance(true)
有更大的内存泄漏的可能性,因为活动字段也将被保留,但在轮换后可能是前一个活动而不是当前活动.
Sac*_*hin 16
自Android API级别23以来,onAttach(活动活动)已被弃用.您需要使用onAttach(Context context).http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity)
Activity是一个上下文,所以如果你只是检查上下文是一个Activity并在必要时强制转换它.
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity a;
if (context instanceof Activity){
a=(Activity) context;
}
}
Run Code Online (Sandbox Code Playgroud)
zaj*_*.m2 10
PJL是对的.我已经使用了他的建议,这就是我所做的:
片段的已定义全局变量:
private final Object attachingActivityLock = new Object();
private boolean syncVariable = false;
实施
Run Code Online (Sandbox Code Playgroud)@Override public void onAttach(Activity activity) { super.onAttach(activity); synchronized (attachingActivityLock) { syncVariable = true; attachingActivityLock.notifyAll(); } }
3.我把我的函数包装起来,我需要在线程中调用getActivity(),因为如果它在主线程上运行,我会用第4步阻塞线程,并且永远不会调用onAttach().
Thread processImage = new Thread(new Runnable() {
@Override
public void run() {
processImage();
}
});
processImage.start();
Run Code Online (Sandbox Code Playgroud)
4.在我需要调用getActivity()的函数中,我使用它(在调用getActivity()之前)
synchronized (attachingActivityLock) {
while(!syncVariable){
try {
attachingActivityLock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有一些UI更新,请记住在UI线程上运行它们.我需要更新ImgeView,所以我做了:
image.post(new Runnable() {
@Override
public void run() {
image.setImageBitmap(imageToShow);
}
});
Run Code Online (Sandbox Code Playgroud)
commit()之后调用回调的顺序:
我需要做一些涉及一些视图的工作,所以onAttach()对我不起作用; 它崩溃了.所以我移动了部分代码,它在commit()(1)之后的一个方法中设置了一些参数,然后在onCreateView()(3.)中处理视图的另一部分代码.
归档时间: |
|
查看次数: |
146332 次 |
最近记录: |