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