2015-01-28 3 views
2

Что я хочу: Пользователь удерживает кнопку нажатой на 1900 мс. Если он выберет свой палец до 1900 мс, телефон перестанет вибрировать. Хотя, если он держит палец на кнопке более 1900 секунд, то работает calculate(). Я использую: postDelayed, поскольку я читаю, это не мешает нить ui. Я пытался проверить, прошел ли 1900 секунд, пользователь не выбрал свой палец, даже если вычислять методы пробега. Ошибка Happenin g: Если пользователь выбирает свой палец до 1900 секунд или просто прикасается и сразу же выбирает, телефон продолжает вибрировать. Хотя это не должно происходить, поскольку я проверяю его с помощью MotionEvent.ACTION_UP. Пожалуйста помоги !!postDelayed blocking ui thread

int flag = 0; 
    int aborted_flag = 0; 
@Override 
public boolean onTouch(View v, MotionEvent event) { 

    Handler mHandler = new Handler(); 

    if(event.getAction()==MotionEvent.ACTION_DOWN){ 
     scanning(); 
     t1 = System.currentTimeMillis(); 
     vibrator.vibrate(1900); 

     mHandler.postDelayed(new Runnable() { 
      public void run() { 
       check(); 
      } 
     }, 1901); 
    } 

    if(event.getAction()==MotionEvent.ACTION_UP){ 
     if(flag == 0){ 
      t2 = System.currentTimeMillis(); 
      vibrator.cancel(); 
      calculate(); 
      aborted_flag = 1; 
     } 
    } 

    return true; 
} 

private void check() { 
    t2 = System.currentTimeMillis(); 
    Log.e("Hello","Inside Check"); 
    Log.e("Hello",""+aborted_flag); 
    vibrator.cancel(); 
    if(aborted_flag==0){ 
     calculate(); 
     flag = 1; 
    } 
} 

private void scanning() { 
    textView.setText("Scanning"); 
} 

private void calculate() { 
    Log.e("t2-t1 ", t2-t1+""); 

    if(t2-t1>=1900){ 
     Random r = new Random(); 
     int k = r.nextInt((5 - 0) + 1) + 0; 
     textView.setText(str[k]); 

     ////////////animation library code///////////// 
     YoYo.with(Techniques.StandUp) 
       .duration(700) 
       .playOn(findViewById(R.id.text_view)); 
     //////////////////////////////////////// 

     changeBackgroundColor(k); 

     //textView.setTextColor(Color.parseColor("#00ff00")); 
     flag = 0; 
    } 
    else{ 
     textView.setText("Aborted\n Try Again"); 
     relativeLayout.setBackgroundResource(R.color.red); 
    } 
} 
public void changeBackgroundColor(final int k) { 
    runOnUiThread(new Runnable(){ 
     public void run() { 
      switch(k){ 
       case 0: relativeLayout.setBackgroundResource(R.color.blue); 
        break; 
       case 1: relativeLayout.setBackgroundResource(R.color.pink); 
        break; 
       case 2:; 
       case 3: relativeLayout.setBackgroundResource(R.color.green); 
        break; 
       default:relativeLayout.setBackgroundResource(R.color.yellow); 
      } 
     } 
    }); 
} 

ответ

0

Потому что в mHandler.postDelayed вы звоните чек(), который вызывает Calculate(), который вызывает relativeLayout.setBackgroundResource(). Пользовательский интерфейс можно изменить только с UIThread.

функция Make:

public void changeBackgroundColor(final int color) { 
    runOnUiThread(new Runnable(){ 
     public void run() { 
      relativeLayout.setBackgroundResource(color); 
      } 
    }); 
} 

И вызвать его из функции вашей рассчитайте().

+0

Я попробовал это, но это не помогает :( –

+0

Какие ошибки вы получаете – kroky

+0

я редактировал код, как вы сказали, и немного незначительные изменения? также, добавив aborted_flag. Я хочу, чтобы пользователь не выбирал свой палец даже после 1900 мс, метод calculate() запускался и менялся цвет экрана. Но происходит то, что если он держит палец, то метод вычисления не работает. –

2

Если вы вызываете postDelayed из потока пользовательского интерфейса, то ваш код будет выполнен в потоке пользовательского интерфейса.

Чтобы использовать другой поток создать:

Thread t = new Thread(new Runnable(){}); 
t.start(); 
+0

, но тогда, как ждать 1900 м. –

+0

Тема: t = новая тема (новая Runnable() { @Override public void run() { try { Thread.sleep (1900); check(); } catch (Исключение e) { e.printStackTrace(); } } }); t.start(); Но это не помогает. Но то, что происходит, это то, что если он держит палец, то метод вычисления не работает –

+0

Да, это отдельный поток, поэтому вы можете просто спать – darnmason