java. Lang.illegalstateexception: cannot perform this operation after onsaveinstancestate: – fragment error
Hi, I use segment a and the second segment B. call B and use the asynctask method, but I use this first time, it works perfectly, but the second time, then the crashed application and my error log are below::: the Samsung tablet I work perfectly, but the three-star core phone crashed application
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)
My class is used to:
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 segment 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,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,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,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,byteArrayimage); fm2.setArguments(bundle); } }); return view; } }
Use the third clip:
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,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,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,"HELLO"); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); hideKeybord(edt_txt); } } public void hideKeybord(View view) { mgr.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.RESULT_UNCHANGED_SHOWN); } }
Solution
It is called state loss You just submitted a fragmenttransaction from asynctask This is prohibited by the framework itself
If you can use the user's unexpected state loss and behavior, you can use
FragmentTransaction#commitAllowingStateLoss()
replace
Fragmenttransaction # submission ()
Anyway, consider reading the links I provide, which is a very common situation
Editor: in addition, you have a solution to the problem But I guess the consequences of doing so may also lead to the loss of the country However:
Declare the handler in your fragment:
private Handler handler = new Handler();
Then, in your onpostexecute (..) Do it in this way.
@Override protected void onPostExecute(String result) { progress.dismiss(); Toast.makeText(getActivity().getApplicationContext(),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,"HELLO"); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } }); return; }