getActivity在某些设备中变为null

时间:2017-04-19 08:50:21

标签: android android-fragments android-fragmentactivity

我有应用程序有片段和得到一些错误我想去上一个片段所以我用

  

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 中生成的。 我不知道为什么会出现空指针的错误。

1 个答案:

答案 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.
    }
}