我得到了一个NullPointerException,我无法理解为什么会发生这种情况。mainActivityWeakReference.get()似乎返回null。
因此,我的猜测是,一旦加载了类,引用变量就会被重新创建,引用变量将被设置为null,并且只有在调用onCreate方法之后才更新引用。但我不明白的是,我正忙着在引用指向的活动中执行指令,但是引用是空的。
活动能共存片刻吗?我该如何处理这种情况呢?在我看来,一个简单的空检查似乎不足以解决这个问题。也许我应该叫finish();
public class MainActivity extends android.support.v7.app.AppCompatActivity {
private WeakReference<AppCompatActivity> mainActivityWeakReference = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
mainActivityWeakReference = new WeakReference<AppCompatActivity>(this);
}
public void handleAction(UserAction userAction) {
switch (userAction) {
case UPDATE_UI:
<< ERROR HERE
mainActivityWeakReference.get().getSupportFragmentManager().executePendingTransactions();
break;
}
}
我的书库痕迹:
java.lang.NullPointerException: Attempt to read from field 'android.os.Handler android.support.v4.a.m.a' on a null object reference
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1476)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
at za.co.entersekt.nedbank.MainActivity.handleAction(MainActivity.java:297)
添加了更多细节:
public abstract class FragmentManager {
....
public boolean execPendingActions() {
if (mExecutingActions) {
throw new IllegalStateException("Recursive entry to executePendingTransactions");
}
if (Looper.myLooper() != mActivity.mHandler.getLooper()) {<<FragmentManager.java:1476
throw new IllegalStateException("Must be called from main thread of process");
}
发布于 2016-02-10 12:31:09
这是因为根据定义,a weak reference is a reference that does not protect the referenced object from collection by a garbage collecton
因此,如果您需要一个活动实例,请尝试执行getActivity()
或getContext()
发布于 2017-07-29 11:42:31
我的解决方案是通过钩子方法获得活动:
public class MainFragment extends Fragment implements....
//....
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
activityWeakReference = new WeakReference<>((AppCompatActivity) activity);
}
是的,由于几个原因,活动可以重新创建,此时弱引用变为空,并且不包含强引用,因此有资格进行垃圾收集。
如果要保存一个强引用,那么整个活动就没有资格进行垃圾收集,这是一个严重的内存泄漏,占用内存的时间比它应该保存的时间更长。
gan被重新创建有几个原因,其中一些原因是:方向的改变,语言的改变,甚至当android因为内存的限制而决定这么做的时候。
https://stackoverflow.com/questions/35314754
复制相似问题