آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

تغییر متن TextView قبل از Sleep قابل مشاهده نیست

jafar  12 سال پیش  12 سال پیش
0 0

سلام

چرا فقط "jafar mohammadzadeh" بعد 5 ثانیه نشون داده میشه و اول "salam"  نشون داده نمیشه

 public class TredkhodkarActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView txtred = (TextView) findViewById(R.id.txtred);
        txtred.setText("salam");

        try {
            Thread.sleep(5000);

        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        txtred.setText("jafar mohammadzadeh");

    }
}
0 0
:| حرفی ندارم :( ، مطمئنی خروجی نمیده ؟ (12 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
sadeghbarout  12 سال پیش
0 0

تا اونجایی که من میدونم توی متد oncreat اجزای صفحه هنوز در صفحه بارگذاری نشدن(روی گوشی) و وقتی شما mainthread رو sleep میکنی برنامه متوقف میشه تا اون زمان بگذره

برای این کاری که شما میخوای انجام بدی باید از یه thread استفاده کنی :

  public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView txtred = (TextView) findViewById(R.id.txtred);
txtred.setText("salam");
final Handler handler = new Handler();
Thread thread = new Thread(new Runnable() {

@Override
public void run() {
try {
Thread.sleep(2000);
handler.post(new Runnable() {

@Override
public void run() {

txtred.setText("jafar mohammadzadeh");

}
});

}
catch (InterruptedException e) {
e.printStackTrace();
}

}
});

thread.start();

}
0 0
من اینطور متوجه شدم که توی oncreate بعد از setconentview همه چی ساخته شده ، پس اصولا نباید مشکلی توی دسترسی بهش باشه ! ، البته دوستمون درست از رشته استفاده نکرده بودم و شما کاملش کردی :) ، فقط میخواسته یه وقفه بده (12 سال پیش)
0 0
ولی من هنوز معتقدم که هنوز کنترل ها ساخته نشدن! میتونی با گرفتن height با width اونها این موضوعو چک کنی ;) البته فقط کافیه به برنامه 0.0001 ثانیه فرصت بدی تا بسازتشون (مثلا با یه thread مثل بالا) (12 سال پیش)
0 0
:| ، وقتی کد به خط بعد میره ، که اجرای جد قبل تکمیل بشه دیگه ؟! ، اینطور نیست ؟ (12 سال پیش)
0 0
پاسخ من رو ببینید (12 سال پیش)
پاسخ به سوال 
uncocoder  12 سال پیش
+1 0

Render تصویر و پاسخ به ورودی ها توسط Main Thread یا همان UI Thread انجام میشه. اما هر چند میلی ثانیه یکبار. مثلاً وقتی قرار باشه UI در هر ثانیه 60 بار ترسیم بشه، پس هر 1000/60 میلی ثانیه یکبار دستور Render تصویر اجرا خواهد شد.

وقتی شما setText می کنید، تغییر محتوای TextView انجام میشه اما Render نمیشه. در همین حین بلافاصله دستور بعدی که Sleep هست اجرا میشه و MainThread به خواب میره. پس باز هم تصویر Render نمیشه ( چون Main Thread در خواب هست ). بعد دوباره تا بیدار میشه setText میشه و متن عوض میشه و وقتی موقع Render تصویر میرسه که setText دوم اجرا شده بوده ( یا خیلی سریع تغییر می کنه که قابل دیدن با چشم نیست ).

در کل استفاده کردن از Sleep در MainThread ممنوع است.

0 0
ممنون استاد از توضیح خوبتون (12 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .