ব্যতিক্রম পাচ্ছে "অবৈধ স্ট্যাটেক্সটেকশন: onSaveInstanceState এর পরে এই ক্রিয়াটি সম্পাদন করতে পারবেন না"


355

আমার কাছে একটি লাইভ অ্যান্ড্রয়েড অ্যাপ্লিকেশন রয়েছে, এবং বাজার থেকে আমি স্ট্যাকের ট্রেস পেয়েছি এবং এটিকে অ্যাপ্লিকেশন কোডে কেন ঘটছে না তবে এটি অ্যাপ্লিকেশন থেকে কিছু বা অন্য ইভেন্টের কারণে ঘটছে বলে আমার ধারণা নেই (

আমি টুকরাগুলি ব্যবহার করছি না, এখনও ফ্রেগমেন্টম্যানেজারের একটি উল্লেখ রয়েছে। যদি কোনও শরীর এই ধরণের সমস্যা এড়ানোর জন্য কোনও গোপন তথ্যগুলিতে কিছুটা আলোকপাত করতে পারে:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)  

আপনি কি এখনও কোনও সমাধান খুঁজে পেয়েছেন? : এখানে একই সমস্যা হচ্ছে stackoverflow.com/questions/7575921/...
nhaarman


2
@ ফ্লেবাস না আপনি করেননি। আপনার ডায়লগ উদ্বেগ, এবং এটি না। আপনার স্ট্যাক ট্রেস মিলনের শীর্ষ লাইনটি যথেষ্ট নয়। বাকিটা খুব আলাদা। আমি এটি বলছি কারণ আমি কেবল আপনার সমস্যাটি অনুসন্ধান করতে গিয়েছিলাম এবং এটি দুর্ভাগ্যক্রমে আমার কোনও সহায়ক নয়।
থিসিটিজন

আপনি কি সেই কার্যকলাপে কোনও থ্রেড বা অ্যাসিনটাস্ক ব্যবহার করেন?
হোসে কাস্ত্রো

21
আমি আমার ব্লগ পোস্টে এই ত্রুটিটি নিয়ে আলোচনা করছি ... আপনার এটি পড়া উচিত। :)
অ্যালেক্স লকউড

উত্তর:


455

এটি এখন পর্যন্ত সবচেয়ে মূ .় বাগটি আমার মুখোমুখি হয়েছে। আমি একটি ছিল Fragmentজন্য পুরোপুরি কাজ আবেদন এপিআই <11 , এবং Force Closingউপর এপিআই> 11

আমি Activityডেকে লাইফসাইকের ভিতরে তারা কী বদলেছে তা আমি সত্যিই বুঝতে পারি না saveInstance, তবে আমি এখানে কীভাবে এটি সমাধান করেছি:

@Override
protected void onSaveInstanceState(Bundle outState) {
    //No call for super(). Bug on API Level > 11.
}

আমি কেবল কল করতে পারি না .super()এবং সবকিছু দুর্দান্ত কাজ করে। আমি আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।

সম্পাদনা: আরও কিছু গবেষণা করার পরে, এটি সমর্থন প্যাকেজের একটি পরিচিত বাগ

আপনার যদি উদাহরণটি সংরক্ষণ করার প্রয়োজন হয় এবং আপনার সাথে কিছু যুক্ত outState Bundleকরতে পারেন তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
}

সম্পাদনা 2:Activity আপনি ব্যাকগ্রাউন্ডে চলে যাওয়ার পরে যদি কোনও লেনদেন করার চেষ্টা করছেন তবে এটিও ঘটতে পারে । এটি এড়াতে আপনার ব্যবহার করা উচিতcommitAllowingStateLoss()

সম্পাদনা 3: উপরের সমাধানগুলি আমার প্রাথমিক স্মৃতি থেকে শুরু করে সাপোর্ট.ভি 4 লাইব্রেরিতে সমস্যাগুলি ঠিক করছিল from তবে আপনার যদি এখনও এ নিয়ে সমস্যা থাকে তবে আপনার অবশ্যই @ অ্যালেক্সলকউডটি পড়তে হবে ব্লগটি : লেনদেন এবং ক্রিয়াকলাপের রাজ্যের ক্ষতি

ব্লগ পোস্ট থেকে সংক্ষিপ্তসার (তবে আমি আপনাকে এটি পড়ার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি):

  • এর commit() পরে কখনও লেনদেন হয় নাonPause()প্রাক-হানিকম্ব এবং onStop()মধু পরবর্তী পোস্টে
  • Activityলাইফসাইকেল পদ্ধতিতে লেনদেন করার সময় সাবধানতা অবলম্বন করুন । ব্যবহার onCreate() ,onResumeFragments() এবংonPostResume()
  • অ্যাসিক্রোনাস কলব্যাক পদ্ধতিতে লেনদেন সম্পাদন করা এড়িয়ে চলুন
  • commitAllowingStateLoss()কেবলমাত্র সর্বশেষ অবলম্বন হিসাবে ব্যবহার করুন

97
আপনার প্রতিশ্রুতি () পরিবর্তে কমিটএলিংস্টেস্টলস () ব্যবহার করা উচিত
মে

7
সুতরাং অন সেভইনস্ট্যান্সস্টেটে সুপার না কল করা ফ্র্যাগমেন্টম্যানেজার সমস্ত খণ্ডের অবস্থা সংরক্ষণ করতে এবং সেগুলি পুনরুদ্ধার করতে সক্ষম হবেন। যে ঘূর্ণন সঙ্গে সমস্যা হতে পারে। এছাড়াও, আমি বান্ডলে জাঙ্ক লাগানোর বিষয়ে কেবল অন্য জিনিসটি চেষ্টা করেছি এবং এটি আমার পক্ষে কোনও পার্থক্য করে না। নিশ্চিত হতে পারছি না কিভাবে এটা would - বাগ আপনি সমর্থন প্যাকেজের মধ্যে রেফারেন্সড একটি নালপয়েন্টারএক্সেপশন, এবং এই IllegalStateException মতো মনে হচ্ছে না ...
themightyjon

56
@ মেম commitAllowingStateLoss()কেবল ব্যতিক্রম এড়িয়ে চলে। এটি আপনার অ্যাপ্লিকেশনটিকে দুর্ঘটনাজনিত রাষ্ট্রীয় ক্ষতি থেকে রক্ষা করে না। এই ব্লগ পোস্ট দেখুন
অ্যালেক্স লকউড

2
@ অ্যালেক্সলকউড তাই ব্লগ পোস্টটি থেকে আমরা শিখতে পারি যে আমাদের নেটওয়ার্কের সমস্ত কলটি খণ্ডের ভিতরে করা উচিত (এবং প্রয়োজনে কিছু অস্থায়ী অগ্রগতি ইউআই প্রদর্শন করা উচিত) এবং কেবলমাত্র এই ব্যতিক্রমটি এড়াতে পারি যখন সম্ভবত এটি ঘটায় কারণ কিছু অ্যাসিক্রোনাস পদ্ধতি কলের পরে ডাকা হচ্ছে।
meh

1
আমি প্রথম পয়েন্টটি পাই না: "মধুচক্র পরবর্তী পোস্টে ... অনস্টপ () এর পরে কখনই কমিটমেন্ট () লেনদেন করি না"। আমার যদি কোনও খণ্ডের সাথে অন্য একটি প্রতিস্থাপনের জন্য ট্রিগার করতে একটি বোতামের প্রয়োজন হয়? স্টপ অনটপ বন্ধ হয়ে গেছে কিনা তা পরীক্ষা করে এমন একটি বুলিয়ান রেখে দেওয়া উচিত, এবং যদি এটি হয়, পরিবর্তে কমিটএলিউস্টিংস্টেটলস কল করুন? এছাড়াও, যদি আমার কোনও টুকরোটির মধ্যে একটি টুকরো থাকে তবে আমার একটি বোতামের ক্লিকের পরিবর্তে দরকার?
অ্যান্ড্রয়েড বিকাশকারী

76

কী কারণে এই সমস্যার কারণ অ্যান্ড্রয়েড উত্স কোড অনুসন্ধান করা তা FragmentManagerImplক্লাসে ফ্ল্যাগ এমস্টেটসভেড করে (উদাহরণে ক্রিয়াকলাপে উপলব্ধ) এর মান সত্য। কল থেকে যখন পিছনের স্ট্যাকটি সংরক্ষণ করা হবে (সেভআলস্টেট) সংরক্ষণ করা হবে তখন এটি সত্য হয়ে থাকে Activity#onSaveInstanceState। পরবর্তীতে ActivityThread থেকে কল থেকে পাওয়া রিসেট পদ্ধতি ব্যবহার করে এই পতাকা রিসেট করবেন না FragmentManagerImpl#noteStateNotSaved()এবংdispatch()

আপনার অ্যাপটি কী করছে এবং কী ব্যবহার করছে তার উপর নির্ভর করে কিছু উপায় উপলভ্য রয়েছে যা আমি এটি দেখতে পাচ্ছি:

ভাল উপায়

অন্য কিছু করার আগে আমি বিজ্ঞাপন হবে অ্যালেক্স লকউড নিবন্ধ । তারপরে, আমি এ পর্যন্ত যা করেছি তা থেকে:

  1. টুকরোগুলি এবং ক্রিয়াকলাপগুলির জন্য যা কোনও রাজ্যের তথ্য রাখার দরকার নেই, কমিটএলস্টেস্টলস কল করুন । ডকুমেন্টেশন থেকে নেওয়া:

    কোনও ক্রিয়াকলাপের স্থিতি সংরক্ষণের পরে প্রতিশ্রুতি কার্যকর করার অনুমতি দেয়। এটি বিপজ্জনক কারণ কারণ যদি ক্রিয়াকলাপটি পরে তার রাজ্য থেকে পুনরুদ্ধার করা প্রয়োজন তবে প্রতিশ্রুতিটি হারাতে পারে, সুতরাং এটি কেবলমাত্র সেই ক্ষেত্রে ব্যবহার করা উচিত যেখানে ইউআই রাষ্ট্রের পক্ষে ব্যবহারকারীর উপর অপ্রত্যাশিতভাবে পরিবর্তন ঘটে ` আমার ধারণা, যদি খণ্ডটি কেবল পঠনযোগ্য তথ্য দেখায় তবে এটি ব্যবহার করা ঠিক আছে। অথবা তারা সম্পাদনযোগ্য তথ্য প্রদর্শন করেও, সম্পাদিত তথ্য ধরে রাখতে কলব্যাক্স পদ্ধতি ব্যবহার করুন।

  2. শুধু পরে লেনদেন কমিট হয় (আপনি শুধু বলা commit()), একটি কল করা FragmentManager.executePendingTransactions()

প্রস্তাবিত উপায়গুলি নয়:

  1. ওভিডিউ লাট্টু যেমন উপরে উল্লিখিত হয়েছে, কল করবেন না super.onSaveInstanceState()। তবে এর অর্থ আপনি খণ্ড খণ্ডের সাথে আপনার ক্রিয়াকলাপের পুরো রাজ্যটি হারাবেন।

  2. ওভাররাইড করুন onBackPressedএবং কেবল সেখানে কল করুন finish()। আপনি যদি অ্যাপ্লিকেশনটি টুকরো এপিআই ব্যবহার না করেন তবে এটি ঠিক থাকতে হবে; যেমন super.onBackPressedএকটি কল আছে FragmentManager#popBackStackImmediate()

  3. আপনি যদি উভয় ফ্রেমমেন্টস এপিআই ব্যবহার করছেন এবং আপনার ক্রিয়াকলাপের অবস্থা গুরুত্বপূর্ণ / অত্যাবশ্যক, তবে আপনি প্রতিবিম্ব এপিআই ব্যবহার করে কল করার চেষ্টা করতে পারেন FragmentManagerImpl#noteStateNotSaved()। তবে এটি একটি হ্যাক, বা কেউ বলতে পারে এটি একটি কর্মচঞ্চল। আমি এটি পছন্দ করি না তবে আমার ক্ষেত্রে এটি বেশ গ্রহণযোগ্য, যেহেতু আমার কাছে কোনও উত্তরাধিকার অ্যাপ্লিকেশন থেকে একটি কোড রয়েছে যা অবহিত কোড ব্যবহার করে ( TabActivityএবং স্পষ্টভাবে LocalActivityManager)।

নীচে কোডটি প্রতিবিম্ব ব্যবহার করে:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    invokeFragmentManagerNoteStateNotSaved();
}

@SuppressWarnings({ "rawtypes", "unchecked" })
private void invokeFragmentManagerNoteStateNotSaved() {
    /**
     * For post-Honeycomb devices
     */
    if (Build.VERSION.SDK_INT < 11) {
        return;
    }
    try {
        Class cls = getClass();
        do {
            cls = cls.getSuperclass();
        } while (!"Activity".equals(cls.getSimpleName()));
        Field fragmentMgrField = cls.getDeclaredField("mFragments");
        fragmentMgrField.setAccessible(true);

        Object fragmentMgr = fragmentMgrField.get(this);
        cls = fragmentMgr.getClass();

        Method noteStateNotSavedMethod = cls.getDeclaredMethod("noteStateNotSaved", new Class[] {});
        noteStateNotSavedMethod.invoke(fragmentMgr, new Object[] {});
        Log.d("DLOutState", "Successful call for noteStateNotSaved!!!");
    } catch (Exception ex) {
        Log.e("DLOutState", "Exception on worka FM.noteStateNotSaved", ex);
    }
}

চিয়ার্স!


এটি জিঞ্জারব্রেডের অধীনে অ্যাকশনবারশারলকের সাথেও ঘটেছিল বলে মনে হয়, তাই বিল্ড আইডি চেক করার বিষয়টি মনে হচ্ছে ... :(
t0mm13b

এছাড়াও, আপনার উল্লেখ করা উচিত - এটি ABS ব্যবহারের জন্যও উপযুক্ত নয় :)
t0mm13b

@ t0mm13b: উপরের কোডটি আমার প্রকল্পের জন্য দাঁড়িয়েছে কারণ এটি না টুকরো টুকরো টুকরো টুকরো করে না সমর্থন করে। এটি অ্যান্ড্রয়েড.এপ.অ্যাক্টিভিটিতে চলে এবং যেহেতু ব্যতিক্রমটিকে ট্রিগার করে তোলে অসামঞ্জস্যতা ফ্রেগমেন্ট ম্যানেজার (এপিআই স্তর ১১ টি উপরে) এর ফলে ঘটে থাকে, এজন্য চেক ... আপনি যদি বিশ্বাস করেন যে অশুভের উত্স আপনার পক্ষেও একই, তবে নির্দ্বিধায় অনুভব করুন চেক অপসারণ করতে। এটি সামঞ্জস্যতা প্যাকেজ এবং সমর্থন বাস্তবায়নের শীর্ষে চলে আসার কারণে এবিএস একটি আলাদা গল্প ra ফ্রেগমেন্টএটিভিটি একইভাবে ফ্রেগমেন্টম্যানেজার এবং ভয়েলা: একই সমস্যা ব্যবহার করতে পারে।
গুনার

@ t0mm13b: আরও 600 টি চর যোগ করার জন্য পর্যাপ্ত পরিমাণ নেই, আপনাকে প্রথমে তদন্ত করতে হবে যে এটি আপনার জন্য কী ঘটছে। আপনারও বুঝতে হবে যে উপরেরটি একটি কুরুচিপূর্ণ হ্যাক এবং এটি চালানো বা না চালানোতে আমি কোনও দায়িত্ব নিচ্ছি না (আমার পক্ষে পরিস্থিতি বিবেচনায় সেরা সমাধান ছিল)। আপনার যদি এটি ব্যবহার করতে হয় তবে চলক নামগুলির জন্য কমপ্যাট উত্স কোডটি ডাবল চেক করুন কারণ এটি স্ট্যান্ডার্ড প্যাকেজ থেকে পৃথক হতে পারে। আমি আশা করব এই সমস্যা সামঞ্জস্য প্যাকেজের পরবর্তী সংস্করণ দ্বারা মোকাবেলা করা, কিন্তু Android অভিজ্ঞতা থেকে, কয়েক ঘটতে সম্ভাবনা আছে ...
gunar

উহহ ... এই বাগ রিপোর্টে ঠিক ঠিক একই সমস্যাটি যা এই ওপি-র প্রশ্নের মূল বিষয়। আমি আমার মন্তব্যে দাঁড়িয়ে আছি - আপনার স্পষ্টভাবে দাবি অস্বীকার করা উচিত ছিল এবং বলা উচিত যে এটির নিশ্চয়তা নেই এবং এটিও বলা উচিত ছিল যে আপনি টুকরোগুলি ব্যবহার করেন নি - নইলে কেন উত্তরটি পোস্ট করা বিরক্ত করবেন! :) শুধু বলছি ...
t0mm13b

35

আপনার খণ্ড ক্রিয়াকলাপটি onSaveInstanceState()ডেকে যাওয়ার পরে আপনি যদি খণ্ডিত রূপান্তর সম্পাদন করার চেষ্টা করেন তবে এই ধরনের ব্যতিক্রম ঘটবে ।

এর কারণগুলির একটি কারণ হ'ল আপনি যদি কোনও কার্যকলাপ বন্ধ হয়ে যায় তখন কোনও AsyncTask(বা Thread) চালনা ছেড়ে দিচ্ছেন ।

এরপরে যেকোন রূপান্তর onSaveInstanceState()বলা হয়ে থাকে যদি সিস্টেমটি সংস্থানগুলির জন্য ক্রিয়াকলাপটিকে পুনরায় দাবি করে এবং পরে এটি পুনরায় তৈরি করে তবে সম্ভাব্যতা হারাতে পারে।


2
আরে ফাঙ্ক, আমার এখানে একটি প্রশ্ন রয়েছে, যদি সেই কার্যকলাপ বা খণ্ডন বন্ধ হয়ে যায় তবে কীভাবে অনব্যাকপ্রেসডকে সেই ক্রিয়াকলাপ বা খণ্ডন করতে বলা যেতে পারে। উপরের ব্যতিক্রমটি কিছু UI ইভেন্ট (যেমন BACK কী টিপছে) থেকে উত্পন্ন হয়েছে বলে মনে হচ্ছে, যদিও আমি Async টাস্ক এবং পিছনের কীটির মধ্যে সম্পর্কটি খুঁজে নিতে সক্ষম নই।
ডিসকুল

যেহেতু আপনি খণ্ডের স্থানগুলি ব্যাক স্টেটে সংরক্ষণ করতে পারেন, পিছনে বোতামটি টিপলে আপনি সংরক্ষণ করা সংক্রমণের বিপরীত ঘটতে পারে (যাতে পুরানো টুকরোগুলি ফিরে আসে)। onSaveInstanceState আপনার সিস্টেমে রিসোর্স পুনরুদ্ধার করার জন্য ক্রিয়াকলাপ ধ্বংস হওয়ার আগে ডাকা হয়, অনসটপ কল করার পরে সবসময় নয়। দুঃখিত, এটি আমার উত্তর খুব পরিষ্কার ছিল না।
FunkTheMonk

চমত্কার, তবে আমি আমার অ্যাপ্লিকেশনটিতে কোনও টুকরো ব্যবহার করছি না। এটি স্থানীয় কোডে ব্যবহৃত টুকরা হতে পারে। এর আগে আমি ভেবেছিলাম আপনি একই কথা বলছেন
ডিসকুল

1
আমার একটি খণ্ডের রেফারেন্স সহ অ্যাসিঙ্কটাস্ক ছিল। OnSaveInstanceState থেকে সুপার () কলটি সরিয়ে এবং আমার অ্যাসিঙ্কটাস্ক থেকে রেফারেন্সটি WeakReferences <ফ্রেমেন্ট> দিয়ে প্রতিস্থাপনের পরে সমস্যার সমাধান হয়েছে।
মহিষ 15

2
@ বুফালো এটি অবশ্যই সমস্যার সমাধান নয়। আপনি সর্বদা কল করা উচিত super.onSaveInstanceState()
অ্যালেক্স লকউড

27

কেবলমাত্র কল super.onPostResume () আপনার টুকরা দেখাচ্ছে আগে বা super.onPostResume কলিং পর onPostResume আপনার কোড সরাতে () মেথড ()। এটি সমস্যার সমাধান!


6
পোস্টপ্রেসিউম () কল করে তা নিশ্চিত করে যে অনারিউমফ্রেগমেন্টস () কল হয়ে যায় এবং আমার কাছে এটিই আদর্শ সমাধান।
j2emanue

20

dismiss()স্ক্রীনটি লক করা-ফাঁকা করার পরে এবং কার্যকলাপ + ডায়ালগের দৃষ্টান্তের অবস্থাটি সংরক্ষণ করার পরে একটি ডায়লগ খণ্ডে কল করার সময় এটিও ঘটতে পারে । এই কলটি পেতে:

dismissAllowingStateLoss()

আক্ষরিক প্রতি একক বার আমি কোনও কথোপকথন খারিজ করছি আমি আর যাইহোক এটির অবস্থা সম্পর্কে চিন্তা করি না, তাই এটি করা ভাল - আপনি আসলে কোনও রাজ্য হারাচ্ছেন না।


2
এটি আমার সঠিক সমস্যা ছিল! আপনি স্যার উজ্জ্বল!
তাশ পেমিভা

17

সংক্ষিপ্ত এবং কাজের সমাধান:

সাধারণ পদক্ষেপগুলি অনুসরণ করুন:

পদক্ষেপ 1 : স্ব স্ব বিভাগে onSaveInstanceState অবস্থা ওভাররাইড করুন। এবং এটি থেকে সুপার পদ্ধতি সরান।

@Override
public void onSaveInstanceState(Bundle outState) {
};

পদক্ষেপ 2 : কমিটএলিউস্টিংস্টেটলস () ব্যবহার করুন; প্রতিশ্রুতিবদ্ধ পরিবর্তে (); টুকরা অপারেশন।

fragmentTransaction.commitAllowingStateLoss();

1
সুপার পদ্ধতিটি মুছে ফেলা কৌশলটি করেছে, আপনি কেন ব্যাখ্যা করতে পারবেন? এটি মুছে ফেলা কি নিরাপদ?
ব্রুস

7
এটি সুপার () অপসারণ করা নিরাপদ নয়, এর পরে আপনি অন্যান্য ডেটা কনফিডেন্স হারাবেন!
ডেডফিশ

12

আমি মনে করি লাইফসাইকেল রাষ্ট্র অ্যান্ড্রয়েড সমর্থন লাইব v26.1.0 থেকে শুরু করে এই জাতীয় ক্রাশ রোধ করতে সহায়তা করতে পারে আপনার নিম্নলিখিত চেক করতে পারেন:

if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)){
  // Do fragment's transaction commit
}

অথবা আপনি চেষ্টা করতে পারেন:

Fragment.isStateSaved()

আরও তথ্য এখানে https://developer.android.com/references/android/support/v4/app/Fraament.html#isStateSaved ()


7

এটি আমার পক্ষে কাজ করেছে ... এটি আমার নিজের থেকেই খুঁজে পেয়েছে ... আশা করি এটি আপনাকে সহায়তা করবে!

1) গ্লোবাল "স্ট্যাটিক" ফ্রেগমেন্টম্যানেজার / ফ্র্যাগমেন্ট ট্রান্সজেকশন নেই।

2) অনক্রিট করুন, সবসময় আবার ফ্র্যাগমেন্টম্যানেজারটি আরম্ভ করুন!

নিচে নমুনা: -

public abstract class FragmentController extends AnotherActivity{
protected FragmentManager fragmentManager;
protected FragmentTransaction fragmentTransaction;
protected Bundle mSavedInstanceState;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSavedInstanceState = savedInstanceState;
    setDefaultFragments();
}

protected void setDefaultFragments() {
    fragmentManager = getSupportFragmentManager();
    //check if on orientation change.. do not re-add fragments!
    if(mSavedInstanceState == null) {
        //instantiate the fragment manager

        fragmentTransaction = fragmentManager.beginTransaction();

        //the navigation fragments
        NavigationFragment navFrag = new NavigationFragment();
        ToolbarFragment toolFrag = new ToolbarFragment();

        fragmentTransaction.add(R.id.NavLayout, navFrag, "NavFrag");
        fragmentTransaction.add(R.id.ToolbarLayout, toolFrag, "ToolFrag");
        fragmentTransaction.commitAllowingStateLoss();

        //add own fragment to the nav (abstract method)
        setOwnFragment();
    }
}

6

অ্যাক্টিভিটি ফরআরসাল্ট () পদ্ধতিতে খণ্ড দেখানোর চেষ্টা করার সময় আমি সর্বদা এটি পেয়ে যাচ্ছিলাম, সুতরাং সমস্যাটি পরবর্তী ছিল:

  1. আমার ক্রিয়াকলাপটি বিরতি দেওয়া এবং থামানো হয়েছে, যার অর্থ হ'ল onSaveInstanceState () ইতিমধ্যে বলা হয়েছিল (প্রাক-হানিকম্ব এবং পোস্ট-মধুযন্ত্র উভয় ডিভাইসের জন্য)।
  2. কোনও ফলাফলের ক্ষেত্রে আমি খণ্ডগুলি দেখানোর / আড়াল করার জন্য লেনদেন করেছি, যার কারণে এটি অবৈধ স্টেটএক্সেপশন হয়।

আমি যা তৈরি করেছি তা পরবর্তী:

  1. আমি যে পদক্ষেপ নিতে চাই তা নির্ধারণের জন্য অতিরিক্ত মূল্য যুক্ত করা হয়েছে (উদাহরণস্বরূপ ক্যামেরার থেকে ছবি তোলা - ফটোপটেন) - আপনার কতটা আলাদা লেনদেন দরকার তা নির্ভর করে এটি বুলিয়ান বা পূর্ণসংখ্যার মান হতে পারে।
  2. ওভারডেন অন রিসুমফ্র্যাগমেন্টস () পদ্ধতিতে আমি আমার মানটি পরীক্ষা করেছিলাম এবং খণ্ড খণ্ডের পরে আমার প্রয়োজনীয় লেনদেন করা হয়েছে। অন ​​- সেভআইন্সট্যান্সস্টেটের পরে এই ক্ষেত্রে কমিট () করা হয়নি, কারণ অনার্সফ্রামমেন্টগুলি () পদ্ধতিতে রাষ্ট্র ফিরিয়ে দেওয়া হয়েছিল।

5

আমি কনফিগারেশন পরিবর্তন করে সমস্যাটি সমাধান করেছি। কৌশলটি হ'ল অ্যান্ড্রয়েডের ক্রিয়াকলাপের জীবনচক্র অনুসারে, যখন আপনি স্পষ্টভাবে একটি অভিপ্রায় (ক্যামেরা অভিপ্রায়, বা অন্য কোনও) নামে ডাকেন; ক্রিয়াকলাপ বিরতি দেওয়া হয় এবং সেই ক্ষেত্রে অনসভেডআইনস্ট্যান্স বলা হয়। ডিভাইসটি যখন ক্রিয়াকলাপটি সক্রিয় ছিল সেই ব্যতীত অন্য কোনও স্থানে ঘোরানোর সময়; ফ্র্যাগমেন্ট কমিটের মতো টুকরো অপারেশন করা অবৈধ রাষ্ট্র ব্যতিক্রম ঘটায়। এটি সম্পর্কে প্রচুর অভিযোগ রয়েছে। এটি অ্যান্ড্রয়েড ক্রিয়াকলাপ জীবনচক্র পরিচালনা এবং সঠিক পদ্ধতি কল সম্পর্কে কিছু। এটি সমাধান করার জন্য আমি এটি করেছি: 1-আপনার ক্রিয়াকলাপের onSvedInstance পদ্ধতি ওভাররাইড করুন এবং বর্তমান স্ক্রিন ওরিয়েন্টেশন (প্রতিকৃতি বা ল্যান্ডস্কেপ) নির্ধারণ করুন তারপরে আপনার ক্রিয়াকলাপ বিরতি দেওয়ার আগে আপনার স্ক্রিন ওরিয়েন্টেশনটি এটিতে সেট করুন। এই ক্রিয়াকলাপটি আপনি যে ক্রিয়াকলাপটিকে আপনার কার্যকলাপের জন্য স্ক্রিন রোটেশনটিকে লক করে তা যদি অন্য কোনও দ্বারা আবর্তিত হয়। 2-তারপরে, ক্রিয়াকলাপের ওনরসিউম পদ্ধতিটি ওভাররাইড করুন এবং আপনার ওরিয়েন্টেশন মোডটি এখন সেন্সরে সেট করুন যাতে অনসভেদ পদ্ধতিটি বলার পরে এটি সঠিকভাবে ঘূর্ণনটি সঠিকভাবে মোকাবেলা করার জন্য আরও একবার onconfigration কল করবে।

আপনি এই কোডটি মোকাবেলা করতে এই কোডটিকে আপনার ক্রিয়াকলাপে অনুলিপি / পেস্ট করতে পারেন:

@Override
protected void onSaveInstanceState(Bundle outState) {       
    super.onSaveInstanceState(outState);

    Toast.makeText(this, "Activity OnResume(): Lock Screen Orientation ", Toast.LENGTH_LONG).show();
    int orientation =this.getDisplayOrientation();
    //Lock the screen orientation to the current display orientation : Landscape or Potrait
    this.setRequestedOrientation(orientation);
}

//A method found in stackOverflow, don't remember the author, to determine the right screen orientation independently of the phone or tablet device 
public int getDisplayOrientation() {
    Display getOrient = getWindowManager().getDefaultDisplay();

    int orientation = getOrient.getOrientation();

    // Sometimes you may get undefined orientation Value is 0
    // simple logic solves the problem compare the screen
    // X,Y Co-ordinates and determine the Orientation in such cases
    if (orientation == Configuration.ORIENTATION_UNDEFINED) {
        Configuration config = getResources().getConfiguration();
        orientation = config.orientation;

        if (orientation == Configuration.ORIENTATION_UNDEFINED) {
        // if height and widht of screen are equal then
        // it is square orientation
            if (getOrient.getWidth() == getOrient.getHeight()) {
                orientation = Configuration.ORIENTATION_SQUARE;
            } else { //if widht is less than height than it is portrait
                if (getOrient.getWidth() < getOrient.getHeight()) {
                    orientation = Configuration.ORIENTATION_PORTRAIT;
                } else { // if it is not any of the above it will defineitly be landscape
                    orientation = Configuration.ORIENTATION_LANDSCAPE;
                }
            }
        }
    }
    return orientation; // return value 1 is portrait and 2 is Landscape Mode
}

@Override
public void onResume() {
    super.onResume();
    Toast.makeText(this, "Activity OnResume(): Unlock Screen Orientation ", Toast.LENGTH_LONG).show();
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} 

4

আমার একই সমস্যা ছিল IllegalStateException পেয়ে, কিন্তু আমার সমস্ত কলগুলি প্রতিশ্রুতিবদ্ধ করতে () কমিটএলিংস্টেস্টস লস () দিয়ে প্রতিস্থাপন করা কোনও কাজে দেয় নি।

অপরাধী ডায়ালগফ্রেগমেন্ট.শো () এ কল করেছিল।

আমি এটি দিয়ে ঘিরে

try {
    dialog.show(transaction, "blah blah");
}
catch(IllegalStateException e) {
    return;
}

এবং এটি এটা করেছে। ঠিক আছে, আমি ডায়লগটি দেখতে পাচ্ছি না, তবে এই ক্ষেত্রে এটি ভাল ছিল।

এটি আমার অ্যাপে একমাত্র জায়গা যেখানে আমি প্রথমে ফ্রেগমেন্ট ম্যানেজ.আরবিগান ট্রান্সজিশন () বলেছিলাম কিন্তু কখনই কমিট () বলা হয়নি তাই যখন আমি "কমিট ()" সন্ধান করেছি তখন এটি পেলাম না।

মজার বিষয় হ'ল ব্যবহারকারী কখনই অ্যাপটি ছাড়েন না। পরিবর্তে ঘাতকটি অ্যাডমব আন্তঃসম্পর্কীয় বিজ্ঞাপন দেখাচ্ছে।


3
একই অবস্থা. আমি 'শো' (ফ্রেগমেন্টম্যানেজার ম্যানেজার, স্ট্রিং ট্যাগ) 'পদ্ধতি ওভাররাইডিং সমাধান করেছি,' কমিট 'এর পরিবর্তে' কমিটএলিংস্টেটলস '; কিছু হারাচ্ছি কারণ আমি ডায়ালগের দুটি ব্যক্তিগত বৈশিষ্ট্য সেট করতে পারি না: এমডিজমসড এবং এমশাউনবিএম M তবে এটি প্রতিবারই কাজ করছে বলে মনে হয় :)
ফ্রান্সেস্কো দিতরানী

আমি ডায়ালগফ্র্যাগমেন্টের বিকল্প সমাধান করেছি, যা এই ব্যতিক্রম এড়াতে পারে: github.com/AndroidDeveloperLB/ ডায়ালগশার্ড
অ্যান্ড্রয়েড বিকাশকারী

4

আমার সমস্যার সমাধান ছিল

খণ্ডে পদ্ধতি যুক্ত করুন:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...
    guideMapFragment = (SupportMapFragment)a.getSupportFragmentManager().findFragmentById(R.id.guideMap);
    guideMap = guideMapFragment.getMap();
    ...
}

@Override
public void onDestroyView() {
    SherlockFragmentActivity a = getSherlockActivity();
    if (a != null && guideMapFragment != null) {
        try {
            Log.i(LOGTAG, "Removing map fragment");
            a.getSupportFragmentManager().beginTransaction().remove(guideMapFragment).commit();
            guideMapFragment = null;
        } catch(IllegalStateException e) {
            Log.i(LOGTAG, "IllegalStateException on exit");
        }
    }
    super.onDestroyView();
}

খারাপ হতে পারে, তবে এর চেয়ে ভাল আর কিছু পাইনি।


ট্রু .. ব্যতিক্রম ধরা অ্যাপ্লিকেশন ক্রাশ এড়াতে পারে তবে আচরণের ফলে এ জাতীয় খণ্ডগুলি স্ক্রিনে রেখে যাওয়া বা যুক্ত হওয়া যায় না।
মার্কোস ভাসকনস্লোস

4
স্ক্রোলিং রাখা। সত্য আছে
anil

4

আমি এই সমস্যাটি পেয়েছি ut তবে আমি মনে করি এই সমস্যাটি প্রতিশ্রুতিবদ্ধ এবং কমিটএলস্টেস্টলস সম্পর্কিত নয়।

নিম্নলিখিত স্ট্যাক ট্রেস এবং ব্যতিক্রম বার্তা প্রতিশ্রুতিবদ্ধ সম্পর্কে ()।

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)

তবে এই ব্যতিক্রমটি অনব্যাকপ্রেসড () দ্বারা হয়েছিল

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(Unknown Source)
at android.support.v4.app.FragmentActivity.onBackPressed(Unknown Source)

এগুলি সমস্তই চেকস্টেটলস () এর কারণে হয়েছিল

private void checkStateLoss() {
    if (mStateSaved) {
        throw new IllegalStateException(
                "Can not perform this action after onSaveInstanceState");
    }
    if (mNoTransactionsBecause != null) {
        throw new IllegalStateException(
                "Can not perform this action inside of " + mNoTransactionsBecause);
    }

#SateInstanceState এর পরে এমস্টেটসেভটি সত্য হবে।

এই সমস্যাটি খুব কমই ঘটে I

আমি 25517 সংখ্যাটি পেয়েছি

এটি নিম্নলিখিত পরিস্থিতিতে হতে পারে

  1. OnSaveInstanceState এর পরে পিছনে কী বলা হয়, তবে নতুন ক্রিয়াকলাপ শুরু হওয়ার আগে।

  2. কোডটিতে onShop () ব্যবহার করুন

আমি নিশ্চিত নই যে সমস্যার মূলটি কী। সুতরাং আমি একটি কুরুচিপূর্ণ উপায় ব্যবহার করেছি।

@Override
public void onBackPressed() {

    try{
        super.onBackPressed();
    }catch (IllegalStateException e){
        // can output some information here
        finish();
    }
}

আমি সত্যিই সমস্যার সমাধান করি নি, তবে এই সমস্যাটি কমিট এবং কমিটএলস্টেস্টলস সম্পর্কিত নয়।
oO_ox

4

আমি আমার অ্যাপে একই সমস্যা পেয়েছি। আমি এই সমস্যাটি কেবল super.onBackPressed();পূর্ববর্তী শ্রেণিতে কল commitAllowingStateLoss()করে এবং বর্তমান ক্লাসে সেই খণ্ডটি দিয়ে কল করছি have


2
ধন্যবাদ. এই সমাধানটি ইস্যুটির commitAllowingStateLoss()পরিবর্তে ইস্যুটি সমাধান করেছেcommit()
চিন্তাক প্যাটেল

CommitAllowingStateLoss () ব্যবহার করবেন না medium.com/@elye.project/...
swooby

3

যদি কোনও ব্যবহারকারী স্ক্রিনটি ঘুরিয়ে দেয় যাতে onsaveInstance ডাকা হবে যাতে এটি নতুন ওরিয়েন্টেশনের সাথে যুক্ত রিসোর্সগুলি লোড করতে পারে।

এই ব্যবহারকারীর পিছনে বোতাম টিপুন এবং তারপরে স্ক্রিনটি ঘোরানো সম্ভব (কারণ এটিও সম্ভব যে এই ব্যবহারকারী আপনার অ্যাপ্লিকেশনটি ব্যবহার করার সময় তাদের ফোনটি বিভ্রান্ত করলেন)


2
কনফিগারেশনের পরিবর্তনগুলি (যেমন ওরিয়েন্টেশন পরিবর্তন হিসাবে) এর ব্যতিক্রম ঘটতে পারে তবে এগুলি মূল কারণ নয়।
অ্যালেক্স লকউড


2

আমার কাছ থেকে একই সমস্যা এবং সমস্ত নিবন্ধ, ব্লগ এবং স্ট্যাকওভারফ্লো একদিন দীর্ঘ বিশ্লেষণের পরে আমি একটি সহজ সমাধান পেয়েছি। সেভডআইনস্ট্যান্সস্টেটটি মোটেও ব্যবহার করবেন না, কোডের এক লাইনের শর্ত এটি। খণ্ড কোডে:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
    .....

2

এটি যখনই ঘটে আপনি কোনও খণ্ড লোড করার চেষ্টা করছেন তবে কার্যকলাপটি তার স্থিতিটি অনপজ () এ পরিবর্তিত করেছে This এটি উদাহরণস্বরূপ ঘটে যখন আপনি ডেটা আনার এবং ক্রিয়াকলাপে এটি লোড করার চেষ্টা করেন তবে তখনই ব্যবহারকারী কিছু বোতাম ক্লিক করে এবং পরবর্তী ক্রিয়াকলাপে সরানো হয়েছে।

আপনি এটি দুটি উপায়ে সমাধান করতে পারেন

আপনি খণ্ডটি লোড করতে লেনদেন.কমের পরিবর্তে লেনদেন.কমএলিং স্টেটলস () ব্যবহার করতে পারেন তবে আপনার করা কমিট অপারেশনটি হারিয়ে ফেলতে পারেন।

অথবা

নিশ্চিত করুন যে কোনও খণ্ড লোড করার সময় ক্রিয়াকলাপটি পুনরায় শুরু হয়েছে এবং স্থিতি স্থির হবে না। একটি বুলিয়ান তৈরি করুন এবং চেক করুন যে ক্রিয়াকলাপটি পজ () অবস্থায় চলছে না।

@Override
public void onResume() {
    super.onResume();
    mIsResumed = true;
}

@Override
public void onPause() {
    mIsResumed = false;
    super.onPause();
}

তারপরে অংশটি লোড করার সময় ক্রিয়াকলাপ উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং কেবলমাত্র কার্যকলাপের অগ্রভাগের সময় লোড করুন।

if(mIsResumed){
 //load the fragment
}

1

ধন্যবাদ @ গুনার, তবে আমি মনে করি এর থেকে আরও ভাল উপায় আছে।

ডকের মতে:

 * If you are committing a single transaction that does not modify the
 * fragment back stack, strongly consider using
 * {@link FragmentTransaction#commitNow()} instead. This can help avoid
 * unwanted side effects when other code in your app has pending committed
 * transactions that expect different timing.
 *
 * @return Returns true if there were any pending transactions to be
 * executed.
 */
public abstract boolean executePendingTransactions();

সুতরাং commitNowপ্রতিস্থাপন করতে ব্যবহার করুন:

fragmentTransaction.commit();
FragmentManager.executePendingTransactions()

0

ঠিক আছে, উপরোক্ত সমস্ত সমাধান সাফল্য ছাড়াই চেষ্টা করার পরে (কারণ মূলত আমার লেনদেন নেই)।

আমার ক্ষেত্রে আমি সতর্কতা ডায়ালগ এবং প্রগ্রেস ডায়ালগকে টুকরো হিসাবে ব্যবহার করছিলাম যা কখনও কখনও, ঘূর্ণনের সময়, ফ্রেগমেন্টম্যানেজারের জন্য জিজ্ঞাসা করলে ত্রুটিটি বেড়ে যায়।

আমি বেশ কয়েকটি অনুরূপ পোস্টগুলিকে মিশ্রিত করে একটি কাজের সন্ধান পেয়েছি:

এটি একটি 3 ধাপের সমাধান, সমস্তই আপনার ফ্র্যাগমেন্টএটিভিটিতে সম্পন্ন হয় (এই ক্ষেত্রে এটির জেনেরিক অ্যাক্টিভিটি বলা হয়):

private static WeakReference<GenericActivity> activity = null; //To avoid bug for fragments: Step 1 of 3

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //To avoid bug for fragments: Step 2 of 3
    activity = new WeakReference<GenericActivity>(this);
}

@Override
public FragmentManager getSupportFragmentManager(){
    //To avoid bug for fragments: Step 3 of 3
    if (this == activity.get()) {
        return super.getSupportFragmentManager();
    }
    return activity.get().getSupportFragmentManager();
}

0

যখন আমি একটি খণ্ডে স্টার্টেটিভিটি ব্যবহার করি, তখন আমি এই ব্যতিক্রমটি পাব;

আমি যখন স্টার্টেটিভিটিফেরসাল্ট ব্যবহার করতে পরিবর্তন করি তখন ব্যতিক্রমটি চলে যায় :)

সুতরাং এটির সমাধানের সহজ উপায় হ'ল স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট এপিআই ব্যবহার করুন :)


0

আমি যখন আমার মানচিত্রের খণ্ডগুলির ক্রিয়াকলাপে অভিপ্রায় চয়নকারীটিকে বাতিল করতে পিছনে বোতাম টিপছিলাম তখন আমি এই ব্যতিক্রম পাচ্ছিলাম। আমি অনসার্ট () যেখানে আমি খণ্ডটি আরম্ভ করছিলাম এবং লেনদেন করছিলাম) কোডটি অন স্টার্টে () পরিবর্তিত করে এটি সমাধান করেছি এবং অ্যাপ্লিকেশনটি এখন ভাল কাজ করছে। আশা করি এটা সাহায্য করবে.


0

এটি অ্যান্ড্রয়েড ৪.২ এবং সমর্থন লাইব্রেরির উত্সেও স্থির করা হয়েছে [[*]

কারণের বিশদ জন্য (এবং কাজের আশেপাশে) গুগল বাগ রিপোর্ট দেখুন: http://code.google.com/p/android/issues/detail?id=19917

আপনি যদি সমর্থন লাইব্রেরি ব্যবহার করছেন তবে আপনার এই বাগ (দীর্ঘকাল ধরে) [*] নিয়ে চিন্তা করার দরকার নেই। তবে, আপনি যদি সরাসরি এপিআই ব্যবহার করেন (অর্থাত্ সমর্থন লাইব্রেরির ফ্রেগমেন্টম্যানেজারটি ব্যবহার করছেন না) এবং অ্যান্ড্রয়েড ৪.২ এর নিচে কোনও এপিআই লক্ষ্যবস্তু করছেন তবে আপনার কাজের আশেপাশের একটি চেষ্টা করতে হবে।

[*] লেখার সময় অ্যান্ড্রয়েড এসডিকে ম্যানেজার এখনও একটি পুরানো সংস্করণ বিতরণ করছে যা এই বাগটি প্রদর্শন করে।

সম্পাদনা আমি এখানে কিছু স্পেসিফিকেশন যুক্ত করতে যাচ্ছি কারণ যে কেউ এই উত্তরটি নিচে ভোট দিয়েছিল আমি অবশ্যই স্পষ্টভাবে বিভ্রান্ত করেছি।

বেশ কয়েকটি বিভিন্ন (তবে সম্পর্কিত) পরিস্থিতি রয়েছে যা এই ব্যতিক্রমটি ছুঁড়ে ফেলার কারণ হতে পারে । উপরের আমার উত্তরটি প্রশ্নে আলোচিত নির্দিষ্ট উদাহরণের উল্লেখ করছে অর্থাত্ অ্যান্ড্রয়েডে একটি বাগ যা পরবর্তীতে সংশোধন করা হয়েছে। আপনি যদি অন্য কারণে এই ব্যতিক্রমটি পান তবে এটি কারণ আপনি যখন না থাকা উচিত টুকরো টুকরো যোগ / মুছে ফেলছেন (খণ্ডের রাজ্যগুলি সংরক্ষণের পরে)। আপনি যদি এইরকম পরিস্থিতিতে থাকেন তবে সম্ভবত " নেস্টেড টুকরো - অবৈধ স্ট্যাটেক্সটেক্সপশন" onSaveInstanceState এর পরে এই ক্রিয়াটি সম্পাদন করতে পারবেন না " " আপনার পক্ষে কার্যকর হতে পারে।



0

আমার ব্যবহারের ক্ষেত্রে: কিছু ঘটনা ঘটেছে বলে ক্রিয়াকলাপটি জানানোর জন্য আমি শ্রোতাদের খণ্ডে ব্যবহার করেছি। আমি কলব্যাক পদ্ধতিতে নতুন টুকরা কমিট করেছি। এটি প্রথমবারে পুরোপুরি সূক্ষ্ম কাজ করে। তবে ওরিয়েন্টেশন পরিবর্তনে ক্রিয়াকলাপটি পুনরায় সংরক্ষণ করা হয়েছে সংরক্ষিত উদাহরণের রাজ্যের সাথে। সেক্ষেত্রে খণ্ডটি আবার তৈরি করা হয় নি বোঝা যায় যে খণ্ডটির শ্রোতা রয়েছে যা পুরানো ধ্বংস হওয়া ক্রিয়াকলাপ। কল ব্যাক পদ্ধতি যে কোনও উপায়ে ক্রিয়াতে ট্রিগার হয়ে উঠবে। এটি সমস্যাটিকে ধ্বংসকারী ক্রিয়াকলাপে চলে যায়। সমাধানটি হ'ল শ্রোতাকে বর্তমান লাইভ ক্রিয়াকলাপের সাথে খণ্ডে পুনরায় সেট করা। এটি সমস্যার সমাধান করে।


0

আমি যা পেয়েছি তা হ'ল যদি অন্য কোনও অ্যাপ্লিকেশনটি ডায়ালগের ধরণের হয় এবং ব্যাকগ্রাউন্ড অ্যাপ্লিকেশনটিতে ছোঁড়ার অনুমতি দেয় তবে প্রায় কোনও পটভূমি অ্যাপ্লিকেশন এই ত্রুটিটি দিয়ে ক্র্যাশ হয়ে যায়। আমি মনে করি প্রতিবার কোনও লেনদেন সম্পাদিত হলে আমাদের তদন্ত করা দরকার যদি উদাহরণটি সংরক্ষণ বা পুনরুদ্ধার করা হয়।


0

আমার ক্ষেত্রে, একই ত্রুটি ব্যতিক্রম সহ, আমি "অনব্যাকপ্রেসড ()" একটি চালানোযোগ্য (আপনি আপনার যে কোনও দৃশ্যের ব্যবহার করতে পারেন) এ রেখেছি:

myView.post(new Runnable() {
                    @Override
                    public void run() {
                        onBackPressed()
                    }
                });

বুঝতে পারছি না কেন, তবে কাজ করে!


একটি ভিউতে পোস্ট করা কেবলমাত্র দৃশ্যটি সঠিকভাবে স্ক্রিনে ছড়িয়ে দেওয়ার পরে আঁকতে সক্ষম হবে; এই প্রায়ই মানে ভ্রমণ নিজেই সম্পূর্ণরূপে পুনরায় শুরু হয়েছে, অত: পর কোন বিষয়
Mercato

0

আপনি ফ্র্যাগমেন্টম্যানেজ.আর.পপব্যাকস্ট্যাকমিডিয়েট () কল করতে পারেন; যখন ক্রিয়াকলাপ বিরতি দেওয়া হয়। ক্রিয়াকলাপ শেষ হয়নি তবে বিরতি দেওয়া হয়েছে এবং অগ্রভাগে নেই। আপনার পপব্যাকস্ট্যাকমিডিয়েট () এর আগে ক্রিয়াকলাপ থেমে আছে কি না তা পরীক্ষা করে দেখতে হবে।


0

আমি খুব আকর্ষণীয় কিছু লক্ষ্য। আমার অ্যাপ্লিকেশনটিতে ফোনের গ্যালারী খোলার বিকল্প রয়েছে এবং ডিভাইসটি কোন অ্যাপ্লিকেশনটি ব্যবহার করতে হবে তা জিজ্ঞাসা করে, সেখানে আমি ডায়লগ থেকে দূরে ধূসর অঞ্চলে ক্লিক করে এই সমস্যাটি দেখেছি। আমি লক্ষ্য করেছি যে কীভাবে আমার কার্যকলাপ অনপেজ থেকে যায়, onSesInstanceState onResume এ ফিরে যায়, অনক্রিটভিউতে দেখার বিষয়টি ঘটে না। আমি অনারুমে লেনদেন করছি। সুতরাং আমি যা করতে পেরেছি তা স্থির করে অন-পজকে প্রত্যাখ্যান করা হচ্ছে, তবে সত্যিকারের অনিয়ন্ত্রিত দেখুন। যদি পতাকাটি সত্য হয় তবে পুনরায় শুরু করুন অন কমিট করুন, অন্যথায় কমিটএলিং স্টেটলস। আমি যেতে এবং অনেক সময় নষ্ট করতে পারে কিন্তু আমি জীবনচক্রটি পরীক্ষা করতে চেয়েছিলাম। আমার কাছে একটি ডিভাইস রয়েছে যা এসডিকিভার্সন 23, এবং আমি এই সমস্যাটি পাই না, তবে আমার আরও একটি আছে যা 21, এবং সেখানে আমি এটি দেখতে পাচ্ছি।


-1

আপনি পপব্যাকস্ট্যাকআইমিডিয়েটের আগে ফ্র্যাগমেন্টএটিভিটি.অনস্টার্ট ব্যবহার করতে পারেন

এটার মত:

public void backStackFragment() {
    this.start();
    getFragmentManager().popBackStackImmediate();
}

public void start(){
    FragmentActivity a = getActivity();
    if(a instanceof DepositPlanPadActivity){
      ((DepositPlanPadActivity)a).onStart();
    }
    if(a instanceof SmallChangePlanPad){
            ((SmallChangePlanPad)a).onStart();
        }
        if(a instanceof UserCenterActivity){
            ((UserCenterActivity)a).onStart();
        }
    }

http://jorryliu.blogspot.com/2014/09/illegalstateexception-can-not-perform.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.