java.lang.IllegalStateException:无法在 onSaveInstanceState 后执行此操作:- 片段中的错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22713002/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 17:26:16  来源:igfitidea点击:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState:- Error in Fragment

javaandroidandroid-fragments

提问by crickpatel0024

Hi I used fragment A and second fragment used b. a call to b and in used asynctaskmethod but I used this first time it is perfectly worked but second time then crash the app and my error log in below ::: I worked Samsung tablet perfect worked but Samsung core mobile in crash the app.

嗨,我使用了片段 A,第二个片段使用了 b。调用 b 和使用的asynctask方法,但我第一次使用它是完美的,但第二次使应用程序崩溃,我的错误日志在下面 ::: 我使用三星平板电脑完美运行,但三星核心移动应用程序崩溃。

E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime:   at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
E/AndroidRuntime:   at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1361)
E/AndroidRuntime:   at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
E/AndroidRuntime:   at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
E/AndroidRuntime:   at com.buymysari.fragment.SendImageServerFragment$SendImageServerTask.onPostExecute(SendImageServerFragment.java:158)
E/AndroidRuntime:   at com.buymysari.fragment.SendImageServerFragment$SendImageServerTask.onPostExecute(SendImageServerFragment.java:1)
E/AndroidRuntime:   at android.os.AsyncTask.finish(AsyncTask.java:631)
E/AndroidRuntime:   at android.os.AsyncTask.access0(AsyncTask.java:177)
E/AndroidRuntime:   at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
E/AndroidRuntime:   at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime:   at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime:   at android.app.ActivityThread.main(ActivityThread.java:4960)
E/AndroidRuntime:   at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime:   at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime:   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
E/AndroidRuntime:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
E/AndroidRuntime:   at dalvik.system.NativeStart.main(Native Method)

My Class used in:

我的班级用于:

public class TakeCameraFragment extends Fragment {
    Camera mCamera = null;
    private CameraPreview mCameraPreview;

    protected static final int MEDIA_TYPE_IMAGE = 0;
    static String FilePAth = "";
    Button takePicture;
    static String base64string = "";

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

        final View rootView = inflater.inflate(R.layout.camerafragment,
                container, false);

        mCamera = getCameraInstance();

        Log.v("log_tag", "mCamera :: " + mCamera);

        mCameraPreview = new CameraPreview(getActivity(), mCamera);
        FrameLayout preview = (FrameLayout) rootView
                .findViewById(R.id.camera_preview_fragment);

        preview.addView(mCameraPreview);

        takePicture = (Button) rootView
                .findViewById(R.id.btnTakePicturefragment);
        takePicture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                mCamera.takePicture(null, null, mPictureframent);

            }
        });

        return rootView;

    }

    public boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        releaseCamera();
    }

    private void releaseCamera() {
        if (mCamera != null) {
            mCamera.release(); // release the camera for other applications
            mCamera = null;
        }
    }

    private Camera getCameraInstance() {

        try {
            Log.v("log_tag", "camera try:::" + mCamera);
            mCamera = Camera.open();

        } catch (Exception e) {
            // cannot get camera or does not exist
            Log.v("log_tag", "camera catch:::" + mCamera);
            releaseCamera();
        }
        return mCamera;
    }

    private static File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "MyCameraAppFragment");

        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("MyCameraApp", "failed to create directory");
                return null;
            }
        }
        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                .format(new Date());

        FilePAth = mediaStorageDir.getPath() + File.separator + "IMG_fragment_"
                + timeStamp + ".jpg";

        Log.v("log", " FilePAth " + FilePAth);

        File mediaFile;
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_fragment_" + timeStamp + ".jpg");

        return mediaFile;
    }

    PictureCallback mPictureframent = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            File pictureFile = getOutputMediaFile();
            if (pictureFile == null) {
                return;
            }
            try {

                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();


                FragmentManager fm = getFragmentManager();

                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                SetPictureImageFragment fm2 = new SetPictureImageFragment();
                fragmentTransaction.replace(R.id.relative_camerafragment_id,
                        fm2, "HELLO");
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
                Bundle bundle = new Bundle();
                bundle.putByteArray("position", data);
                fm2.setArguments(bundle);
                mCamera.startPreview();

            } catch (FileNotFoundException e) {

            } catch (IOException e) {
            }
        }
    };

}

Second Fragment used:

使用的第二个片段:

public class SetPictureImageFragment extends Fragment {

    ImageView img;
    Bundle bundle;
    byte[] path;
    byte[] byteArrayimage;
    Button conform;
    float x;
    Bitmap b;


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        View view = inflater.inflate(R.layout.capturepicturefragment, null);

        Log.v("log_tag","SetPictureImageFragment");
        bundle = this.getArguments();
        path = bundle.getByteArray("position");

        Log.v("log_tag","SetPictureImageFragment ::: Path :: "+path);
        img = (ImageView) view.findViewById(R.id.camera_preview_fragment_imageview);
        conform=(Button)view.findViewById(R.id.conform);




        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPurgeable = true; // inPurgeable is used to free up
                                    // memory while required


        Bitmap b = BitmapFactory.decodeByteArray(path, 0,path.length,options);

        int width = b.getWidth();
        int height = b.getHeight();
        int newWidth = 500;
        int newHeight  = 500;
         float scaleWidth = ((float) newWidth) / width;

         float scaleHeight = ((float) newHeight) / height;

         Matrix matrix = new Matrix();

         matrix.postScale(scaleWidth, scaleHeight);

         int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();

         int finalDegree = 0;

            if(rotation == 0) {

                    finalDegree = 90;

            }

            if(rotation == 1) {

                    finalDegree = 270;

            }

            if(rotation == 2) {



                    finalDegree = 180;

            }

            if(rotation == 3) {



                    finalDegree = 90;

            }

         matrix.postRotate(finalDegree);

         Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0,width, height, matrix, true);
         ByteArrayOutputStream stream = new ByteArrayOutputStream();
         resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
         byteArrayimage = stream.toByteArray();

         img.setScaleType(ScaleType.CENTER);
         img.setImageBitmap(resizedBitmap);


        conform.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                FragmentManager fm = getChildFragmentManager();
                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                SendImageServerFragment fm2 = new SendImageServerFragment();
                // CreateStoreFragment fm2 = new CreateStoreFragment();
                fragmentTransaction.replace(R.id.relative_cameraimageview_fragment, fm2,
                        "HELLO");
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
                Bundle bundle = new Bundle();
                bundle.putByteArray("position", byteArrayimage);
                fm2.setArguments(bundle);

            }
        });


        return view;
    }

}

Third Fragment used:::

使用的第三个片段:::

public class SendImageServerFragment extends Fragment {
    SegmentedRadioGroup segmentText;
    SegmentedRadioGroupMale segmentTextMale;
    Button sendImg;
    EditText edt_txt;
    MyApplication app;
    View view;
    Bundle bundle;
    byte[] path;
    String base64string = "";
    Bitmap b;
    String cat_id = "";
    String gender = "";
    private ProgressDialog progress;
    InputMethodManager mgr;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        view = inflater.inflate(R.layout.sendimageserver, null);

        // view.setFocusableInTouchMode(true);
        // view.requestFocus();
        bundle = this.getArguments();
        path = bundle.getByteArray("position");
        segmentText = (SegmentedRadioGroup) view
                .findViewById(R.id.segment_text);
        segmentTextMale = (SegmentedRadioGroupMale) view
                .findViewById(R.id.segment_text_male);
        sendImg = (Button) view.findViewById(R.id.btn_send_image);
        edt_txt = (EditText) view.findViewById(R.id.edt_text_store_name);

        edt_txt.requestFocus();
        mgr = (InputMethodManager) getActivity().getSystemService(
                Context.INPUT_METHOD_SERVICE);
        mgr.showSoftInput(edt_txt, InputMethodManager.SHOW_IMPLICIT);
        app = (MyApplication) getActivity().getApplicationContext();

        sendImg.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                int segTxt = segmentText.getCheckedRadioButtonId();
                RadioButton radiocatButton = (RadioButton) view
                        .findViewById(segTxt);
                int segmentTextMaleTxt = segmentTextMale
                        .getCheckedRadioButtonId();
                RadioButton radioSexButton = (RadioButton) view
                        .findViewById(segmentTextMaleTxt);

                // b = BitmapFactory.decodeByteArray(path, 0, path.length);
                base64string = Base64.encodeToString(path, Base64.DEFAULT);

                if (radiocatButton.getText().toString().equals("S")) {
                    cat_id = "4";

                } else if (radiocatButton.getText().toString().equals("C")) {
                    cat_id = "1";
                } else if (radiocatButton.getText().toString().equals("A")) {
                    cat_id = "5";
                }

                if (radioSexButton.getText().toString().equals("M")) {
                    gender = "Male";

                } else if (radioSexButton.getText().toString().equals("F")) {
                    gender = "Female";
                }

                progress = new ProgressDialog(getActivity());
                progress.setMessage("Loading...");
                new SendImageServerTask(progress).execute("Home");

            }
        });

        return view;
    }





    public class SendImageServerTask extends AsyncTask<String, Void, String> {

        public SendImageServerTask(ProgressDialog progress) {
            progress = progress;
        }

        public void onPreExecute() {
            progress.show();

        }

        @Override
        protected String doInBackground(String... arg) {

            String msg = DBAdpter.userUpdateImageStore(app.getStoreId(),
                    edt_txt.getText().toString(), cat_id, base64string, gender);
            Log.v("log_tag", " Msg " + msg);
            return msg;
        }

        @Override
        protected void onPostExecute(String result) {
            // Create here your JSONObject...

            progress.dismiss();
            Toast.makeText(getActivity().getApplicationContext(), result,
                    Toast.LENGTH_LONG).show();

            FragmentManager fm = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            StoreProfileGridFragment fm2 = new StoreProfileGridFragment();
            fragmentTransaction.replace(R.id.relative_sendimage_send, fm2,
                    "HELLO");
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
            hideKeybord(edt_txt);


        }

    }

    public void hideKeybord(View view) {
        mgr.hideSoftInputFromWindow(view.getWindowToken(),
                InputMethodManager.RESULT_UNCHANGED_SHOWN);
    }

}

采纳答案by Drew

It is known as state loss. You happen to commit a FragmentTransaction from AsyncTask. That is prohibited by the framework itself.

它被称为状态损失。您碰巧从 AsyncTask 提交了 FragmentTransaction。这是框架本身所禁止的。

If you are okay with the possibility of state loss and behaviour unexpected by user, you could use

如果您对状态丢失和用户意外行为的可能性感到满意,则可以使用

FragmentTransaction#commitAllowingStateLoss()

FragmentTransaction#commitAllowingStateLoss()

instead of

代替

FragmentTransaction#commit()

FragmentTransaction#commit()

Anyway, consider reading the link I provided, it is a very common situation.

无论如何,请考虑阅读我提供的链接,这是一种非常常见的情况。

Edit:Also, there is a workaround of your problem. But I guess, the consequences of this lead to a possible state loss, too. Nonetheless:

编辑:另外,您的问题有一个解决方法。但我想,这样做的后果也可能导致状态丢失。尽管如此:

Declare a Handlerin your Fragment:

声明一个Handler在你的Fragment

private Handler handler = new Handler();

Then, in your onPostExecute(..)do this:

然后,在你onPostExecute(..)这样做:

@Override
protected void onPostExecute(String result) {    
    progress.dismiss();
    Toast.makeText(getActivity().getApplicationContext(), result,
                Toast.LENGTH_LONG).show();

    handler.post(new Runnable() {
        @Override
        public void run() {
            hideKeybord(edt_txt);
            FragmentManager fm = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            StoreProfileGridFragment fm2 = new StoreProfileGridFragment();
            fragmentTransaction.replace(R.id.relative_sendimage_send, fm2,
                "HELLO");
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();            
        }
    });

    return;
}