我有应用程序有片段和得到一些错误我想去上一个片段所以我用
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.access$500(PaymentProcessFragment.java:113)
at com.nusatrip.fragment.PaymentProcessFragment$1.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.access$500(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 中生成的。 我不知道为什么会出现空指针的错误。
答案 0 :(得分:1)
这里的问题是您正在访问异步类中的活动,当您收到响应时,您的Activity可能已被销毁。
一种可能的解决方案是检查null活动并根据
执行操作我通常遵循的另一个解决方案是使用全局Context对象。
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(最可靠),请确保正确处理上下文。
修改强>
基于你的观点得到一些错误我想要转到之前的片段所以我用过
这是你可以遵循的另一件事,
创建一个界面来处理片段与类的交互
<强> 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();
然后在您的活动中实现此接口并使用片段管理执行更改。
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.
}
}