بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
مشکل با thread - چراتایمر در اولین اجرا قفل می شود؟
دوستان من یه برنامه نوشتم که داخلش یه سری کلمه بصورت چرخشی در 6 تکست ویو نمایش داده میشه،و بعد از چند ثانیه باید آخرین حرف نمایش داده شده به اکتیویتی بعدی فرستاده بشه. ولی الان با این کدی که نوشتم 2 مشکل دارم:
- مقدار result بجای اینکه آخرین حرف نمایش داده شده باشه، یکی مونده به آخر رو میگیره (ضمن اینکه حلقه یک بار بیشتر از حد مجاز اجرا میشه که اصلا نفهمیدم چرا؟!)
- وقتی اکتیویتی run میشه بعضی وقتا برای چند ثانیه هنگ میکنه بعد مثلا از نصفه شروع به شمردن میکنه! نکته جالب اینجاست که وقتی یه بار دکمه back رو بزنید و دوباره وارد بشین دیگه درست میشه! من که کاملا گیج شدم.. ا از صبح با این کد کلنجار رفتم ولی درست نشده، لطفا کمک کنید.
public class WordRecognize extends Activity { private int k; private boolean flagTime; private int time; private int counter; private int ReadingTime; G func; String result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_word_recognize); final String[] array_word = { "سلام", "دهقان", "سبزی", "شربت", "مداد", "پاکت", "احمد", "فانوس", "دریاچه", "سیب", "کلم", "لباس", "آجر", "قاضی", "وانت", "بطری", "کلبه", "کبوتر", "شیر", "بوقلمون", "موبایل", "مداد" }; // length= 22 final TextView text1 = (TextView) findViewById(R.id.txtW1); final TextView text2 = (TextView) findViewById(R.id.txtW2); final TextView text3 = (TextView) findViewById(R.id.txtW3); final TextView text4 = (TextView) findViewById(R.id.txtW4); final TextView text5 = (TextView) findViewById(R.id.txtW5); final TextView text6 = (TextView) findViewById(R.id.txtW6); final TextView[] txt = { text1, text2, text3, text4, text5, text6 }; for (int i = 0; i < 6; i++) { txt[i].setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources() .getDimension(R.dimen.textsize)); } k = 0; counter = 1; new Thread(new Runnable() { //به نظر میرسه مشکل اصلی از این قسمت به بعد باشه @Override public void run() { while (counter <= 10) { try { Thread.sleep(1000); G.HANDLER.post(new Runnable() { @Override public void run() { int rnd = G.r.nextInt(21); result = array_word[rnd]; txt[k].setText(result); if (k > 0) { txt[k - 1].setText(""); } else if (k == 0) { txt[5].setText(""); } if (k == 5) { k = 0; } else { k++; } counter++; } }); } catch (Exception e) { e.printStackTrace(); } } Intent intent = new Intent(WordRecognize.this, WordResult.class); intent.putExtra("RESULT", result); startActivity(intent); finish(); } }).start(); } }
+1
0
تغییر بدید : counter = 1; به counter = 0; و while (counter (11 سال پیش)
0
0
فرقی نکرد، هر دو تا مشکل پابرجاست (11 سال پیش)
0
0
مشکل من این نیست که حلقه چند بار اجرا بشه (counter = 12) بلکه مشکل اصلی همون 2 موردی هست که ذکر کردم (11 سال پیش)
برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال
Possible
10 سال پیش
0
0
سلام
اتفاقی این تاپیک رو دیدم و چون خودم قبلا به همچین مشکلی برخورده بودم جوابشو مطرح میکنم وقت دوستان تلف نشه.
مبادا در استفاده از تردینگ هنگام استفاده از حلقه while خود حلقه while رو بیرون از براکت try بنویسین. چون در اینصورت نه
میشه intrupte کرد و نه میشه مقدار کانتر رو فهمید.ولی اگه مقدار while داخل براکت try باشه میتونین خیلی راحت intrupt کنین و دوباره در متد onResume اسارتش کنین.
کلا کار کردن با ترد ها وقتی که با حلقه while هم قاطی میشه خیلی خطرناکه.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .