在收到来自HTTP Post的响应后显示DialogFragment有时会使用IllegalStateException崩溃应用程序

时间:2015-03-17 22:36:31

标签: java android android-dialogfragment illegalstateexception

我在尝试展示java.lang.IllegalStateException时收到DialogFragment。这是显示此对话框的流程:

  1. 使用Android Volley调用服务器API
  2. 来自HTTP Post的回复
  3. 解析JSON并决定如何处理它(在后台线程中)
  4. 使用LocalBroadcast Intent,向Broadcast
  5. 发送Activity
  6. Activity处理Broadcast并检查应用是否位于前台
  7. 如果应用位于前台,则显示DialogFragment
  8. 我认为检查应用程序是否在前台是否足以处理此错误?

    处理此IllegalStateException的正确方法是什么?

    活动w /显示对话框方法

    public void showUpdateAppDialog() {
        if (Helpers.isAppInForeground(this)) {
            mUpdateAppDialog = UpdateAppDialog.newInstance();
            mUpdateAppDialog.show(mFm, GlobalVars.TAG_UPDATE_APP_DIALOG);
        }
    }
    

    带有响应处理程序的Android Volley HTTP Post调用

    public void versionCheck() {
        try {
            JSONObject obj = new JSONObject();
            obj.put(GlobalVars.KEY_PLATFORM, "android");
            obj.put(GlobalVars.KEY_VERSION, Integer.toString(mPrefs.getAppVersion()));
    
            Response.Listener<JSONObject> responseListener = new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(final JSONObject response) {
                    Log.v(TAG_VOLLEY_RESPONSE, GlobalVars.DEST_VERSION_CHECK + ": " + response.toString());
    
                    new Thread(new Runnable() {
                        public void run() {
                            boolean updated = false;
    
                            try {
                                if (doesResponseContainError(response)) return;
    
                                if (response.has(GlobalVars.EVENT_VERSION_CHECK)) {
                                    updated = Boolean.valueOf(response.getString(GlobalVars
                                            .EVENT_VERSION_CHECK));
                                }
                            }
                            catch (JSONException e) { e.printStackTrace(); }
                            finally {
                                Intent intent = new Intent(GlobalVars.EVENT_RECEIVER);
                                intent.putExtra(GlobalVars.KEY_EVENT, new ArrayList<>(Arrays.asList(
                                        GlobalVars.EVENT_HIDE_UPDATING_ICON,
                                        GlobalVars.EVENT_VERSION_CHECK)));
                                intent.putExtra(GlobalVars.KEY_IS_UPDATED, updated);
                                LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
                            }
                        }
                    }).start();
                }
            };
    
            sendPost(GlobalVars.DEST_VERSION_CHECK, obj, GlobalVars.DEST_VERSION_CHECK, responseListener);
        }
        catch (JSONException e) { e.printStackTrace(); }
    }
    

    app是否在前台检查

    public static boolean isAppInForeground(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        return tasks.get(0).processName.equalsIgnoreCase(context.getPackageName());
    }
    

    堆栈跟踪

    java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
       at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1365)
       at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1383)
       at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:636)
       at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:615)
       at android.support.v4.app.DialogFragment.show(DialogFragment.java:138)
       at com.walintukai.lovelup.MainActivity.showUpdateAppDialog(MainActivity.java:991)
       at com.walintukai.lovelup.MainActivity.onVersionCheck(MainActivity.java:1269)
       at com.walintukai.lovelup.MainActivity.access$1200(MainActivity.java:90)
       at com.walintukai.lovelup.MainActivity$10.onReceive(MainActivity.java:1142)
       at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
       at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
       at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:146)
       at android.app.ActivityThread.main(ActivityThread.java:5748)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
       at dalvik.system.NativeStart.main(NativeStart.java)
    

0 个答案:

没有答案