0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

در زمان اجرای یک Thread جدید در یک برنامه اندروید به خطای "Only the original thread that created a view hierarchy can touch its views" برخورد کرده ام:

        new Thread(new Runnable() {
            @Override
            public void run() {
		//My Code
            }
        }).start();

دلیل بروز این خطا چیست و چگونه می توان آن را برطرف کرد؟

2 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

در برنامه نویسی اندروید این خطا زمانی رخ می دهد که خارج از UI thread (درون یک Thread جدید) بخواهیم به یک المان UI مانند Button دسترسی داشته باشیم. برای حل این مشکل بسته به موقعیت دو راهکار وجود دارد:

1- اگر در Activity هستید و یا به Activity دسترسی دارید، دستکاری المان UI در Thread جدید را با استفاده از متد runOnUiThread کلاس Activity انجام دهید:

        new Thread(new Runnable() {
            @Override
            public void run() {

                    getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                    //code will always run on the UI thread
                            }
                    });

            }
        }).start();

2- اگر در Activity نیستید و یا به Activity دسترسی ندارید، دستکاری المان UI در Thread جدید را با استفاده از متد post کلاس Handler انجام دهید:

        final Handler handler = new Handler();

        new Thread(new Runnable() {
            @Override
            public void run() {

                handler.post(new Runnable() {
                    @Override
                    public void run() {
                       // code will always run on the UI thread
                    }
                });


            }
        }).start();
0 امتیاز
قبل توسط (2.4هزار امتیاز)

من اول خواستم توی #C رو بگم ولی بعد از یه کم جست و جو  یه مطلب رو دید که دقیقا همین مشکل رو داشت 

و اولین جوابش هم اینه که :

شما باید بخشی که مربوط به رابط گرافیکی هست و رابط کاربر تون رو با روز رسانی می کنه رو توی main اصلی قرار بدی (درسته چون بعد از این که نخ رو بکشید و بخوابونید رابط کاربرتون به مشکل بر می خوره)

لینک و توضیحات بیشتر رو می تونید stackoverflow.com توی دنبال کنید

سوالات مشابه

+1 امتیاز
1 پاسخ 346 بازدید
0 امتیاز
1 پاسخ 2.6هزار بازدید
0 امتیاز
0 پاسخ 313 بازدید
0 امتیاز
1 پاسخ 369 بازدید
0 امتیاز
1 پاسخ 1.9هزار بازدید
...