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

مشکل با thread - چراتایمر در اولین اجرا قفل می شود؟

nooriDeveloper  11 سال پیش  10 سال پیش
0 0

دوستان من یه برنامه نوشتم که داخلش یه سری کلمه بصورت چرخشی در 6 تکست ویو نمایش داده میشه،و بعد از چند ثانیه باید آخرین حرف نمایش داده شده به اکتیویتی بعدی فرستاده بشه. ولی الان با این کدی که نوشتم 2 مشکل دارم:

  1. مقدار result  بجای اینکه آخرین حرف نمایش داده شده باشه، یکی مونده به آخر رو میگیره (ضمن اینکه حلقه یک بار بیشتر از حد مجاز اجرا میشه که اصلا نفهمیدم چرا؟!)
  2. وقتی اکتیویتی 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 هم قاطی میشه خیلی خطرناکه.

 


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