2015-01-14 2 views
0

Я пытаюсь прочитать данные с физического устройства. Для получения данных я использую asynctask, чтобы избежать блокировки пользовательского интерфейса. Когда я нажимаю кнопку, я должен сделать это дважды (для минимальных и максимальных значений): wait 5 секунд; получить данные за 1 секунду. Таким образом, код написан в OnClickListener кнопки. Для первой задачи я использую этот метод:Android asynctask для максимального времени

new android.os.CountDownTimer(5000, 1000) { 
     public void onTick(long millisUntilFinished) { } 
      public void onFinish() {  } 
    }.start(); 

Для второго я использую AsyncTask и в методе doInBackground меня

while(booleanValueMax || booleanValueMin) { 
    //code 
} 

(booleanValueMax и booleanValueMin являются летучими булево). Теперь я ставлю эти два ложь с помощью таймера (за пределами AsyncTask):

Timer min = new Timer();  
min.schedule(new TimerTask() {   
    @Override 
    public void run() { 
     booleanValueMin = false;  
    } 
}, 1000); 

(то же самое для макс)

Теперь я хотел бы использовать тот же AsyncTask для хранения максимального и минимального значения. Поэтому я знаю, какие данные я получаю, проверяя логические значения (в методе doInBackground).

if(booleanValueMax) 
    //store max 
else 
    //store min 

Проблема в том, что эти переменные всегда являются ложными. И я не знаю, почему.

Не есть ли другой путь для достижения своей цели, вместо того, чтобы использовать таймер, CountDownTimer, etc.?I»

+2

сообщение ваши полные code.seems как простые тайминги вопрос –

ответ

0

Просто сделайте два отдельных asynchtask и назвать их по вашему значению, т.е. времени (booleanValueMax || booleanValueMin) {// код }

+0

может быть, это не самый изящный способ, но это работает, и это быстро для моих потребностей. Благодарю. – Matt

0

Вы не показали код, который запускает свой AsyncTask, но: все asynctasks одни и те же нити бассейн. В простейшем случае это всего лишь один поток. Скорее всего, ваша асинктас начинается и заканчивается до того, как будет установлена ​​какая-либо из переменных. Asynctasks предназначены для длительных операций, которые не нужно ждать. Если вы хотите, чтобы ваш код дождался события, лучше используйте Thread. (Ну, можно отправлять сообщения/runnables нити см Looper и Handler.)

0

Вот пример:

private void executeBigTask(){ 
    BigTask bigTask = new BigTask(); 
    bigTask.execute(); 

    // Check 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable(){ 
     @Override 
     public void run() { 
      if (bigTask.getStatus() == AsyncTask.Status.RUNNING){ 
       bigTask.cancel(true); 
      } 
     } 
    }, 10000); 
} 


protected class BigTask extends AsyncTask<String, String, Integer> { 
    @Override 
    protected Integer doInBackground(String... params) { 

     /** 
     LONG TASK 
     */ 

     return 0; 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
     Toast.makeText(MainActivity.this, getString(R.string.task_too_long), Toast.LENGTH_LONG).show(); 
    } 
} 
Смежные вопросы