سؤال

بعد أن أتلقى مكالمة هاتفية أو إجراء واحدة ، (وغيرها من الانقطاعات غير الموثقة) ، يحصل طلبي على nullpointerxception عند استئناف نشاطي. هل يمكن لأي شرح لي أين هو و/أو كيفية إصلاحه؟ عندما يستأنف نشاطي ، فإنه يطلق على ما يبدو ، ويحاول تنفيذ شيء لا فارغ بعد استئنافه. كيف أمنع استدعاء oncreate ()؟

يبدو أن نشاطي ينتهي عندما أضغط على زر الاتصال ، لأنه عندما أحاول تصحيح هذا الخطأ ، ينفصل تصحيح الأخطاء.

تعديل:

لذا ، كيف يمكنني القتل في العملية -> onCreate ()؟ لديّ أنشطة A -> B -> C -> D ، وأنا أضغط مرة أخرى إلى الطريق إلى A ، لا توجد مشكلة. ولكن إذا بدأت برنامجًا آخر ، أو يأتي برنامج آخر إلى المقدمة ، أو تعطل D ، ثم تعطل C ، ثم تعطل B ، ثم تعطل!

تعديل:

لقد حللت B ، C ، D تحطم. كان ذلك لأن الفصل الذي قمت بتخزين متغيرات ثابتة تم تدميره لتحرير الموارد ، وأنشطتي كانت تحصل على متغيرات لاغية.

لكن عندما أعود إلى أ ، أحصل على classcastexception:

08-13 16:52:10.456: ERROR/AndroidRuntime(6048): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bookcessed.booksearch/com.bookcessed.booksearch.activities.ChooseProviderActivity}: java.lang.ClassCastException: android.view.AbsSavedState$1
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.os.Looper.loop(Looper.java:123)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at java.lang.reflect.Method.invoke(Method.java:521)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at dalvik.system.NativeStart.main(Native Method)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048): Caused by: java.lang.ClassCastException: android.view.AbsSavedState$1
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.widget.ProgressBar.onRestoreInstanceState(ProgressBar.java:944)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.View.dispatchRestoreInstanceState(View.java:6138)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.View.restoreHierarchyState(View.java:6117)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1466)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Activity.onRestoreInstanceState(Activity.java:843)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Activity.performRestoreInstanceState(Activity.java:815)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2641)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     ... 11 more

ها هو oncreate ():

super.onCreate(savedInstanceState);
        tempLayout = new RelativeLayout(ChooseProviderActivity.this);
        ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this);
        tempProgress.setIndeterminate(true);
        tempProgress.setId(1); //I suspect this is the problem
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        tempLayout.addView(tempProgress, lp);
        setContentView(tempLayout);

هذا هو المكان الذي أعتقد أن المشكلة تكمن:

tempProgress.setId(1); //I suspect this is the problem
هل كانت مفيدة؟

المحلول

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

ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this);
tempProgress.setIndeterminate(true);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
tempLayout.addView(tempProgress, lp);
setContentView(tempLayout);

لا يتم تحديد المعرف بشكل أساسي إلا عند تعيين معرف في ملفات XML ، حيث تقوم بتعيين معرف سلسلة ثم يتم تجميع R.Java ، وتعيين كل مورد رقم معرف. ليس صحيحا تماما! انظر تحرير!

تعديل

كما لاحظ Superjos في التعليقات ، تحتاج إلى معرف عند العمل مع التخطيطات النسبية. تحقق من المستندات الموجودة على relativelayout.layoutparams.addrule (int ، int) عندما تحتاج إلى معرف.

نهاية التحرير

مثله...

LinearLayout ll = new LinearLayout(SomeClass.this);
ll.setOrientation(VERTICAL);
TextView tv = new TextView(SomeClass.this);
EditText et = new EditText(SomeClass.this);
ll.add(tv);
ll.add(et);

سيكون لهذا عرض TextView فوق عرض EditText. في الحالة الأخرى ... تفعل

ll.add(et);
ll.add(tv);

سوف يضع edittext فوق TextView. لا علاقة له على الإطلاق بكيفية وضعها على الشاشة.

نصائح أخرى

تحقق من هذه الصورة لمعرفة كيف ومتى سيقوم نظام التشغيل باستدعاء تطبيقك. alt text

يتم إنهاء تطبيقك لسبب ما ، ولهذا السبب يتم استدعاء onCreate. يجب عليك حفظ/استئناف حالة التطبيق لتتمكن من التعامل مع هذا بشكل صحيح. القي نظرة على هذه و المرجع المطورين

ربما يستخدم تطبيقك الكثير من الذاكرة ، لذا فإن نظام التشغيل Android يقتلها من أجل الحصول على ذاكرة كافية لتشغيل نشاط آخر.

يمكنك تجربتها مرة أخرى ولا تحضر مكالمة أو أي عملية أثناء تحميل تطبيقك. انتظر حتى يتم تعيينه.

لماذا لا تحاول تجاوز جميع الوظائف الأساسية التي يتم استخدامها خلال دورة حياة النشاط. استخدم adb logcat اكتشف مع log.v حيث يحدث خطأك. ضع سجلًا واحدًا بعد كل سطر في الوظيفة التي يتعطل فيها التطبيق.

أيضا ما الذي تتصل به؟ هل تتصل من أحد محاكي إلى الآخر؟ لم أواجه مشكلة في القطة السجل الموجودة في مثل هذه الحالة.

كنت أستخدم فصلًا مع متغيرات ثابتة واتصال .getStoredStaticVariable() و .saveStoredStaticVariable() وعندما أحاول استرداده ، سيكون الأمر فارغًا ، ربما لأن الفصل تم تدميره لتحرير الموارد.

تحرير: كان هذا هو الحل جزئيًا فقط. الحل ل ClassCastException() كان يتغير

tempProgress.setId(1);

إلى رقم من غير المحتمل أن يستخدمه النظام:

tempProgress.setId(6346346);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top