Я пытаюсь реализовать функциональность, т.е. если сетевое соединение включено, приложение попадет в api. Я добавил код сетевого подключения в родительскую операцию и вызвал метод из его фрагмента, но получаю ошибку ссылки на нулевой объект. Я добавляю код. Пожалуйста, проверьте.
Код родительской активности для вызова функции из фрагмента:
private void showSnack(boolean isConnected) {
String message;
int color;
if (isConnected) {
**FinalizePreOrderFragment finalizePreOrderFragment = new FinalizePreOrderFragment(this);
finalizePreOrderFragment.finalizePreOrderApi();**
}
Код для фрагмента для вызова API
public void finalizePreOrderApi() {
// pBar.setVisibility(View.VISIBLE);
String tag_json_obj = "json_obj_req";
String url = Constants.Pre_Order;
HashMap<String, String> params = new HashMap<String, String>();
final SessionManager sessionManager = new SessionManager(getActivity());
HashMap<String, String> loggedDetails = sessionManager.getLoggedUserDetails();
params.put("api_token", loggedDetails.get("api_token"));
params.put("user_id", loggedDetails.get("id"));
params.put("shops_order_list", lis);
Log.e("TAG", "preOrderApi: " + params);
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
url, new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.e("pre_order_response", response.toString());
try {
if (response.has("error")) {
Toast.makeText(getActivity(), response.getString("error"), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), response.getString("success"), Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.printStackTrace();
Activity activity = getActivity();
if (activity != null && isAdded()) {
Toast.makeText(activity, R.string.some_error_occured, Toast.LENGTH_LONG).show();
}
}
// pBar.setVisibility(View.GONE);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: " + error.getMessage());
Activity activity = getActivity();
if (activity != null && isAdded()) {
Toast.makeText(activity, R.string.some_error_occured, Toast.LENGTH_LONG).show();
pBar.setVisibility(View.GONE);
}
}
});
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
}
Я использую SharedPreference в точке ниже:
final SessionManager sessionManager = new SessionManager(getActivity());
HashMap<String, String> loggedDetails = sessionManager.getLoggedUserDetails();
Я сохраняю свои настройки в классе диспетчера сеансов. И появляется ошибка в точке ниже:
public SessionManager(Context context) {
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
Показать класс SessionManager. Вы получаете исключение во фрагменте или в классе SessionManager?
общедоступный SessionManager (контекст контекста) {this._context = context; pref = _context.getSharedPreferences (PREF_NAME, PRIVATE_MODE); редактор = pref.edit (); }. Этот код находится в моем классе диспетчера сеансов, где я получаю сообщение об ошибке @Piyush
getActivity() возвращает ноль на new SessionManager(getActivity()), потому что finalizePreOrderFragment не подключен к Activity. Почему вы создаете новый экземпляр FinalizePreOrderFragment только для вызова метода finalizePreOrderApi()? Вы уверены, что этот метод вообще должен быть в Fragment?
Да, я уверен, что метод должен быть во фрагменте @MikeM.
Тогда вы не сможете вызвать finalizePreOrderApi(), пока он не будет подключен к Activity; то есть в основном до тех пор, пока не завершится его FragmentTransaction.
Если у вас уже есть экземпляр фрагмента в действии, вам не нужно создавать его повторно.
Вы можете добавить это в свой метод getLoggedUserDetails().
SharedPreferences prefs = getSharedPreferences(YOUR_PREFRENCE_KEY, MODE_PRIVATE);
//Lets say you have stored user_id in object retrieve it
int mUserId = prefs.getInt("user_id", 0);//default is 0
if (mUserId >0)
//Return your Object
else
//User is not logged in or stored in Prefrences
Где вы храните sharedPrefrences?