سؤال

لدي جزء يستدعي مهمة غير متزامنة ، وعندما ترجع النتيجة ، يرتكب فراغمترانزاكتيون.

ومع ذلك ، هذا في بعض الأحيان يعود استثناء غير قانوني بسبب نظام التشغيل استدعاء وظيفة أونستوب () من جزء ، كما لوحظ هنا و هنا.

كان الحل لهذا هو ببساطة نقل المعاملة إلى وظيفة أونريسوم () ، حيث يتم ضمان استعادة حالات الجزء.

مرة أخرى ، ومع ذلك ، هذا يولد مشكلة أخرى:عندما لا يتم إيقاف جزء ، لا بد لي من الانتظار لوظيفة أونريسوم() ليتم استدعاؤها قبل أن يظهر جزء جديد.

كان أحد الحلول التي توصلت إليها هو التقاط استثناء غير قانوني والالتزام في وظيفة أونريسوم () فقط عندما تفشل الوظيفة الموجودة في الدالة غير المتزامنة(كما هو موضح أدناه) ولكن يبدو أنها طويلة وغير ذكية دون داع.أي نصائح أو أفكار لرمز أكثر ذكاء?لقد بدأت للتو البرمجة لالروبوت لذلك أنا من المحتمل جدا أنا في عداد المفقودين شيء..

رمز يبدو شيئا من هذا القبيل:

@Override
public void asyncTaskResult(JSONObject obj) {
    //pre-transaction instructions

    try{
        TestFragment test = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("testvar", obj.optString("testvar", null));
        test.setArguments(bundle);

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.testcontainer, test);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
    catch(illegalStateExeption e){
        //if failed, save data and turn on flag
        mCommitOnResume = true;
        mJSONObj = obj;
}

@Override
Public void onResume(){
    super.onResume();

    //if commit on asyncTaskResult fails, do it here
    if(mCommitOnResume){
        TestFragment test = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("testvar", mJSONObj.optString("testvar", null));
        test.setArguments(bundle);

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.testcontainer, test);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
    }
    mCommitOnResume = false;
}

أي أفكار/نصائح/نصائح هي محل تقدير كبير.

هل كانت مفيدة؟

المحلول

جرب هذا

ft.commitAllowingStateLoss() بدلا من ft.commit()

على سبيل المثال.

        TestFragment test = new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("testvar", obj.optString("testvar", null));
        test.setArguments(bundle);

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.testcontainer, test);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commitAllowingStateLoss();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top