【问题标题】:App crashes when orientation changes in fragment当片段中的方向更改时应用程序崩溃
【发布时间】:2020-02-23 09:53:41
【问题描述】:

更改方向时应用程序崩溃。它显示一个 NullPointerException。我相信这与 SharedPreferences 存储在 saveInSp() 方法中的方式有​​关。但不能缩小问题的范围。 在 onAttach() 中调用了 test() 方法。那么上下文应该是可用的吗?

错误:

2019-10-28 07:50:30.081 19188-19188/com.example E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example, PID: 19188
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences androidx.fragment.app.FragmentActivity.getSharedPreferences(java.lang.String, int)' on a null object reference
    at com.example.OneFragment.saveInSp(OneFragment.java:730)
    at com.example.OneFragment.access$600(OneFragment.java:52)
    at com.example.OneFragment$14.onResponse(OneFragment.java:664)
    at com.example.OneFragment$14.onResponse(OneFragment.java:654)

片段代码:

public class OneFragment extends Fragment implements
        OnChartValueSelectedListener {
    private OnFragmentInteractionListener listener;
    public static OneFragment newInstance() {
        return new OneFragment();
    }
    View rootView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_one, container, false);
        return rootView;

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            listener = (OnFragmentInteractionListener) context;
            test();//Calling test()
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }

    public interface OnFragmentInteractionListener {
    }


    private void test(){
        String tokenUrl = "http://test.org/123/tokener";

        StringRequest request = new StringRequest(Request.Method.POST, tokenUrl, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                if (!response.equals(null)) {

                    try {
                        //Do it with this it will work
                        JSONObject auth = new JSONObject(response);
                        String at = auth.getString("token");
                        String atType = auth.getString("type");
                        saveInSp("access", at);
                        WEB_CALL();
                    } catch (JSONException e) {
                        e.printStackTrace();
                        //.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                    Log.e("Your Array Response", response);
                } else {
                    Log.e("Your Array Response", "Data Null");
                }
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("error is ", "" + error);
            }
        }) {

        };

        if (requestQueue2 == null) {
            requestQueue2 = Volley.newRequestQueue(getActivity());
            requestQueue2.add(request);
        } else {
            requestQueue2.add(request);
        }
    }

    private String getFromSP(String key) {
        SharedPreferences preferences = getActivity().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
        return preferences.getString(key, "");
    }

    private void saveInSp(String key, String value) {
        SharedPreferences preferences = getActivity().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(key, value);
        editor.apply();
    }

}

【问题讨论】:

  • 您总是可以在该行上放置一个断点并查看什么是空的。您很可能丢失了您的活动并重新创建了它。使用上下文更合适。
  • 你是对的。谢谢你的帮助。

标签: android android-fragments sharedpreferences


【解决方案1】:

当一个配置被改变它重新创建整个活动。在您的情况下,您向网络发送请求并尝试保存一些内容。由于它是在回调函数中初始化的,这可能是问题所在。

试试这个:

  • 在 Fragment 类中定义一个字段作为 sharedPreference 实例:
SharedPreferences preference;
  • 在您的onCreateView 中使用您的上下文初始化它并检查nullability
if (getContext() != null) {
   preference = getContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
}
  • 并使用此对象与 sharedPreferences 进行交互:
private void saveInSp(String key, String value) {
        if (preferences != null) {
             // Something was wrong. It's null
             return;
        }
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(key, value);
        editor.apply();
}

如果有帮助请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多