getActivity 在某些设备上为空
getActivity getting null in some devices
我有一个有片段的应用程序,在遇到一些错误时我想转到上一个片段所以我使用了
getActivity().onBackPressed();
它工作正常,但在某些设备上出现错误。
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.nusatrip.fragment.PaymentProcessFragment.receivedError(PaymentProcessFragment.java:633)
at com.nusatrip.fragment.PaymentProcessFragment.access0(PaymentProcessFragment.java:113)
at com.nusatrip.fragment.PaymentProcessFragment.onResponseReceived(PaymentProcessFlightFragment.java:597)
at com.nusatrip.services.FlightTransactionSubmit.onPostExecute(TransactionSubmit.java:35)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.access0(AsyncTask.java:180)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
我在我的其他设备上试过了,一切正常。此错误是在 crashlytics fabric.io 中生成的。
不知道为什么会出现这个空指针错误
这里的问题是您正在异步 class 中访问 activity,当您收到响应时,您的 Activity 可能已经被破坏了。
一种可能的解决方案是检查 null Activity 并根据
执行操作
我通常遵循的另一种解决方案是使用全局上下文对象。
private Context mContext;
@Override
public void onAttach(Context mContext) {
super.onAttach(mContext);
this.mContext = mContext;
}
//then use this context instead of getActivity() wherever required.
//It makes sure that you have active context object even if object is destroyed.
一般来说,这必须避免,因为它可能会导致内存泄漏。理想情况下,您必须更喜欢检查空指针的第 1 步。
如果您想遵循第 2 步(最可靠),请确保正确处理上下文。
编辑
根据你的观点出现一些错误我想转到上一个片段所以我使用了
这是您可以关注的另一件事,
创建一个接口来处理片段与您的 class
的交互
FragmentChanger.java
public interface FragmentChanger{
void removeCurrentFragment();
}
然后按照上述步骤进行以下更改
private FragmentChanger mFragmentChanger;
@Override
public void onAttach(Context mContext) {
super.onAttach(mContext);
this.mFragmentChanger = (FragmentChanger) mContext;
}
//and then in your onError method
mFragmentChanger.removeCurrentFragment();
然后在您的 activity 中实现此接口并使用片段管理执行更改。
public class MyActivity extends AppCompatActivity implements FragmentChanger{
//other codes
@Override
public void removeCurrentFragment(){
getFragmentManager().popBackStackImmediate();
//using onBackpressed is generally not a good idea to go back to previous fragment.
}
}
我有一个有片段的应用程序,在遇到一些错误时我想转到上一个片段所以我使用了
getActivity().onBackPressed();
它工作正常,但在某些设备上出现错误。
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.nusatrip.fragment.PaymentProcessFragment.receivedError(PaymentProcessFragment.java:633)
at com.nusatrip.fragment.PaymentProcessFragment.access0(PaymentProcessFragment.java:113)
at com.nusatrip.fragment.PaymentProcessFragment.onResponseReceived(PaymentProcessFlightFragment.java:597)
at com.nusatrip.services.FlightTransactionSubmit.onPostExecute(TransactionSubmit.java:35)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.access0(AsyncTask.java:180)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
我在我的其他设备上试过了,一切正常。此错误是在 crashlytics fabric.io 中生成的。 不知道为什么会出现这个空指针错误
这里的问题是您正在异步 class 中访问 activity,当您收到响应时,您的 Activity 可能已经被破坏了。
一种可能的解决方案是检查 null Activity 并根据
执行操作我通常遵循的另一种解决方案是使用全局上下文对象。
private Context mContext;
@Override
public void onAttach(Context mContext) {
super.onAttach(mContext);
this.mContext = mContext;
}
//then use this context instead of getActivity() wherever required.
//It makes sure that you have active context object even if object is destroyed.
一般来说,这必须避免,因为它可能会导致内存泄漏。理想情况下,您必须更喜欢检查空指针的第 1 步。
如果您想遵循第 2 步(最可靠),请确保正确处理上下文。
编辑
根据你的观点出现一些错误我想转到上一个片段所以我使用了
这是您可以关注的另一件事,
创建一个接口来处理片段与您的 class
的交互FragmentChanger.java
public interface FragmentChanger{
void removeCurrentFragment();
}
然后按照上述步骤进行以下更改
private FragmentChanger mFragmentChanger;
@Override
public void onAttach(Context mContext) {
super.onAttach(mContext);
this.mFragmentChanger = (FragmentChanger) mContext;
}
//and then in your onError method
mFragmentChanger.removeCurrentFragment();
然后在您的 activity 中实现此接口并使用片段管理执行更改。
public class MyActivity extends AppCompatActivity implements FragmentChanger{
//other codes
@Override
public void removeCurrentFragment(){
getFragmentManager().popBackStackImmediate();
//using onBackpressed is generally not a good idea to go back to previous fragment.
}
}