developKinberg
developKinberg

Reputation: 383

IllegalStateException when change layout in DialogFragment

I get an IllegalStateExceptions on some devices in my DialogFragment, when I do some layout changes. In my DialogFragment I get some data from a JSON via Volley and when a ResponseError occur I want to change some views. So for example this is my method for the view changes:

private void showErrorLayout() {
        mProgressBar.setVisibility(View.INVISIBLE);
        mText.setVisibility(View.VISIBLE);
        mText.setText(getString(R.string.volley_firmware_update_error));
}

And this is my Volley method:

private void checkVersionNetwork() {
    final int fw = sharedPreferencesManager.loadFirmwareVersion();
        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.GET, JSON_LINK, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject object = response.getJSONObject(OBJECT);
                    JSONObject changelogObject = response.getJSONObject(CHANGELOG_OBJECT);

                    if (fw >= Integer.parseInt(object.getString(JSON_FIRMWARE_VERSION))) {
                        Log.i(LOG_TAG, "onResponse: FIRMWARE IS UP TO DATE");
                        mText.setText(R.string.firmware_most_recent);
                        mButton.setText(R.string.sb_ok);
                        btnClose.setVisibility(View.INVISIBLE);
                        mText.setVisibility(View.VISIBLE);
                        mButton.setVisibility(View.VISIBLE);
                        mProgressBar.setVisibility(View.INVISIBLE);

                    } else {
                        Log.i(LOG_TAG, "onResponse: FIRMWARE IS OUT OF DATE");

                        if (Locale.getDefault().getLanguage().equals("en")) {
                            mText.setText(getString(R.string.firmware_need_download) + "\n" + getString(R.string.changes) + "\n" + changelogObject.getString(JSON_FIRMWARE_CHANGELOG_TEXT_ENG));
                        } else if (Locale.getDefault().getLanguage().equals("de")) {
                            mText.setText(getString(R.string.firmware_need_download) + "\n" + getString(R.string.changes) + "\n"  + changelogObject.getString(JSON_FIRMWARE_CHANGELOG_TEXT_GER));
                        }
                        mText.setVisibility(View.VISIBLE);
                        mButton.setVisibility(View.VISIBLE);
                        mProgressBar.setVisibility(View.INVISIBLE);
                        downloadLink = object.getString("url");
                        Log.i(LOG_TAG, "onResponse: " + downloadLink);
                        mButton.setText(getContext().getResources().getString(R.string.download));
                    }
                    Log.i("RESPONSE", object.getString(JSON_FIRMWARE_VERSION));
                } catch (JSONException | NullPointerException e) {
                    e.printStackTrace();
                    showErrorLayout();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VOLLEY", error.toString());
                showErrorLayout();
            }
        }
        );

        mRequestQueue.add(request);
    //}
}

The error message from a Samsung Galaxy S7 with Android 8.0:

java.lang.IllegalStateException: 
  at android.support.v4.app.Fragment.requireContext (Fragment.java:614)
  at android.support.v4.app.Fragment.getResources (Fragment.java:678)
  at android.support.v4.app.Fragment.getString (Fragment.java:700)
  at de.app.haveltec.ilockit.fragment.dialogfragment.FirmwareUpdateDialogFragment.showErrorLayout (FirmwareUpdateDialogFragment.java:172)
  at de.app.haveltec.ilockit.fragment.dialogfragment.FirmwareUpdateDialogFragment.access$1000 (FirmwareUpdateDialogFragment.java:51)
  at de.app.haveltec.ilockit.fragment.dialogfragment.FirmwareUpdateDialogFragment$6.onErrorResponse (FirmwareUpdateDialogFragment.java:269)
  at com.android.volley.Request.deliverError (Request.java:630)
  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run (ExecutorDelivery.java:108)
  at android.os.Handler.handleCallback (Handler.java:789)
  at android.os.Handler.dispatchMessage (Handler.java:98)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6944)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)

Upvotes: 0

Views: 165

Answers (1)

Vinay Rathod
Vinay Rathod

Reputation: 1332

The HTTP request, when complete, invokes either onResponse() or onError() (which work on the main thread) without knowing whether the Activity is still in the foreground or not. If the Activity is gone (the user navigated elsewhere), getActivity() returns null and also check DialogFragment is Added or not.

error in this line, please try this

if(getActivity()!=null && isAdded()) {
    mText.setText(getActivity().getResources().getString(R.string.volley_firmware_update_error));
}

Upvotes: 1

Related Questions