[android] عرض الروبوت لا تعلق على مدير النوافذ



Answers

بعد قتال مع هذه المشكلة ، انتهى بي الأمر في النهاية بهذا الحل:

/**
 * Dismiss {@link ProgressDialog} with check for nullability and SDK version
 *
 * @param dialog instance of {@link ProgressDialog} to dismiss
 */
public void dismissProgressDialog(ProgressDialog dialog) {
    if (dialog != null && dialog.isShowing()) {

            //get the Context object that was used to great the dialog
            Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();

            // if the Context used here was an activity AND it hasn't been finished or destroyed
            // then dismiss it
            if (context instanceof Activity) {

                // Api >=17
                if (!((Activity) context).isFinishing() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                        if (!((Activity) context).isDestroyed()) {
                            dismissWithExceptionHandling(dialog);
                        }
                    } else { 
                        // Api < 17. Unfortunately cannot check for isDestroyed()
                        dismissWithExceptionHandling(dialog);
                    }
                }
            } else
                // if the Context used wasn't an Activity, then dismiss it too
                dismissWithExceptionHandling(dialog);
        }
        dialog = null;
    }
}

/**
 * Dismiss {@link ProgressDialog} with try catch
 *
 * @param dialog instance of {@link ProgressDialog} to dismiss
 */
public void dismissWithExceptionHandling(ProgressDialog dialog) {
    try {
        dialog.dismiss();
    } catch (final IllegalArgumentException e) {
        // Do nothing.
    } catch (final Exception e) {
        // Do nothing.
    } finally {
        dialog = null;
    }
}

في بعض الأحيان ، تعمل الاستثناءات الجيدة بشكل جيد إذا لم يكن هناك حل أفضل لهذه المشكلة.

Question

أواجه بعضًا من الاستثناءات التالية:

java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)

لقد بحثت في Google وشاهدت أن لها علاقة بالنوافذ المنبثقة وتحويل الشاشة ، ولكن لا توجد أية إشارة إلى شفرتي.

الأسئلة هي:

  1. هل هناك طريقة لمعرفة بالضبط متى تحدث هذه المشكلة؟
  2. بخلاف تشغيل الشاشة ، هل هناك حدث أو إجراء آخر يؤدي إلى حدوث هذا الخطأ؟
  3. كيف أمنع حدوث ذلك؟



للسؤال 1):

وبالنظر إلى أن رسالة الخطأ لا يبدو أنها تشير إلى أي خط من شفرتك يسبب المشكلة ، يمكنك تتبعها باستخدام نقاط التوقف. توقف Breakpoints تنفيذ البرنامج عندما يحصل البرنامج على أسطر معينة من التعليمات البرمجية. بإضافة نقاط التوقف إلى المواقع الهامة ، يمكنك تحديد أي سطر من التعليمات البرمجية يتسبب في حدوث العطل. على سبيل المثال ، في حالة تعطل البرنامج في مجموعة setContentView () ، يمكنك وضع نقطة توقف هناك. عندما يتم تشغيل البرنامج ، سوف يتوقف مؤقتًا قبل تشغيل هذا الخط. إذا ثم استئناف يؤدي إلى تعطل البرنامج قبل الوصول إلى نقطة توقف التالية ، فإنك تعرف أن الخط الذي قتل البرنامج كان بين نقطتي التوقف.

إن إضافة نقاط التوقف أمر سهل إذا كنت تستخدم Eclipse. انقر بزر الماوس الأيمن في الهامش الموجود إلى يسار الرمز وحدد "Toggle breakpoint". تحتاج بعد ذلك إلى تشغيل التطبيق الخاص بك في وضع التصحيح ، الزر الذي يشبه الحشرة الخضراء بجوار زر التشغيل العادي. عندما يضرب البرنامج نقطة توقف ، سيتحول Eclipse إلى منظور التصحيح ويعرض لك الخط الذي ينتظره. لبدء تشغيل البرنامج مرة أخرى ، ابحث عن زر "Resume" (السيرة الذاتية) ، والذي يبدو وكأنه "Play" عادي ولكن مع شريط عمودي إلى يسار المثلث.

يمكنك أيضًا تعبئة التطبيق الخاص بك باستخدام Log.d ("My application"، "بعض المعلومات هنا التي تخبرك بمكان سطر السجل") ، والتي تقوم بعد ذلك بنشر الرسائل في نافذة LogCat الخاصة بـ Eclipse. إذا لم تتمكن من العثور على هذه النافذة ، فافتحها باستخدام Window -> Show View -> Other ... -> Android -> LogCat.

امل ان يساعد!




أو ببساطة يمكنك إضافة

protected void onPreExecute() {
    mDialog = ProgressDialog.show(mContext, "", "Saving changes...", true, false);
}

الأمر الذي سيجعل ProgressDialog غير قادر على الإلغاء




إذا كان لديك كائن Activity معلق ، فيمكنك استخدام الأسلوب isDestroyed() :

Activity activity;

// ...

if (!activity.isDestroyed()) {
    // ...
}

هذا جيد إذا كان لديك فئة فرعية AsyncTask غير مجهول التي تستخدمها في أماكن مختلفة.




تم حل مشكلتي عن طريق uhlocking دوران الشاشة على الروبوت الخاص بي التطبيق الذي تسبب لي مشكلة الآن يعمل تماما




عندما تعلن عن نشاط في البيان ، ستحتاج إلى android: configChanges = "orientation"

مثال:

<activity android:theme="@android:style/Theme.Light.NoTitleBar" android:configChanges="orientation"  android:label="traducción" android:name=".PantallaTraductorAppActivity"></activity>



Links