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

时间:2014-03-28 12:33:02

标签: java android android-fragments

您好我使用的是片段A和第二个片段。调用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.access$600(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)

我的班级用于:

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:

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;
    }

}

使用第三片段:::

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);
    }

}

1 个答案:

答案 0 :(得分:43)

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

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

FragmentTransaction#commitAllowingStateLoss()

而不是

FragmentTransaction#commit()

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

修改:此外,还有一个问题的解决方法。但我猜,这种后果也可能造成国家损失。尽管如此:

Handler中声明Fragment

private Handler handler = new Handler();

然后,在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;
}