ارتكاب شظية في أونريسوم.طريقة ذكية لحل هذه?
-
21-12-2019 - |
سؤال
لدي جزء يستدعي مهمة غير متزامنة ، وعندما ترجع النتيجة ، يرتكب فراغمترانزاكتيون.
ومع ذلك ، هذا في بعض الأحيان يعود استثناء غير قانوني بسبب نظام التشغيل استدعاء وظيفة أونستوب () من جزء ، كما لوحظ هنا و هنا.
كان الحل لهذا هو ببساطة نقل المعاملة إلى وظيفة أونريسوم () ، حيث يتم ضمان استعادة حالات الجزء.
مرة أخرى ، ومع ذلك ، هذا يولد مشكلة أخرى:عندما لا يتم إيقاف جزء ، لا بد لي من الانتظار لوظيفة أونريسوم() ليتم استدعاؤها قبل أن يظهر جزء جديد.
كان أحد الحلول التي توصلت إليها هو التقاط استثناء غير قانوني والالتزام في وظيفة أونريسوم () فقط عندما تفشل الوظيفة الموجودة في الدالة غير المتزامنة(كما هو موضح أدناه) ولكن يبدو أنها طويلة وغير ذكية دون داع.أي نصائح أو أفكار لرمز أكثر ذكاء?لقد بدأت للتو البرمجة لالروبوت لذلك أنا من المحتمل جدا أنا في عداد المفقودين شيء..
رمز يبدو شيئا من هذا القبيل:
@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();