2012-01-04 3 views
0

Я внедрил Runnable и проверяет правильность, если логическое значение становится истинным.Проверка возвращаемого значения резьбы навсегда

Но я хочу вернуть это значение в мой класс, где я начинаю тему.

Я заметил, что я могу вернуть значение с помощью Future Callables, с ними я могу просто вычислить что-то и немедленно вернуть его, но я не могу проверить его, если значение становится истинным.

Как я могу это достичь?

Благодарим за помощь.

public class ResultChecker implements Runnable{ 
    private DrawView drawView; 

    public ResultChecker(DrawView drawView){ 
     this.drawView = drawView; 
    } 

    public void run() { 
     boolean run = true; 
     while(run){ 
      if(drawView.isNextQuestion()){ 
       //RETURN VALUE HERE 
       run = false; 
      } 
     } 
    } 

} 
+0

Вы могли бы попробовать и перефразировать это? что вы подразумеваете под «проверкой навсегда»? – fdreger

+0

Я имею в виду, что я хочу проверить isNextQuestion(), пока не остановлю Thread. С Будущими Callables, я могу просто проверить его один раз и получить возвращаемое значение, которое будет ложным. Но это может измениться, пока Thread жив. Поэтому я хочу проверить его навсегда и хочу получить правильный результат, пока не закончу Thread – krackmoe

ответ

1

Если вы хотите опросить, то создайте метод в ResultChecker, который может быть вызван потоком, который хочет вернуть значение.

public class ResultChecker implements Runnable{ 
    private DrawView drawView; 
    private volatile Result r; 

    public ResultChecker(DrawView drawView){ 
     this.drawView = drawView; 
     this.r = null; 
    } 

    public Result poll() { 
     return r; 
    } 

    public void run() { 
     boolean run = true; 
     while(run){ 
      if(drawView.isNextQuestion()){ 
       //RETURN VALUE HERE 
       r = someObject; 
       // once r has been assigned, you cannot touch it again 
       // or the object it refers to from this thread because 
       // there are no locks 
       run = false; 
      } 
     } 
    } 

} 

голосующий будет опрашивать, как это:

r = resultChecker.poll(); 
if(r != null) { 
    // we have result 
} else { 
    // result is not ready 
    // try again later 
} 

Если вы хотите вернуть несколько значений, вы должны продлить это немного с очередью.

+0

Mh .. но как это должно выглядеть «попробуйте еще раз позже»? Я не могу просто вызвать метод снова, у меня будет такая же проблема с этим. Я должен проверить его до тех пор, пока не покину эту активность. – krackmoe

+0

Да, вы просто вызываете его снова, когда хотите, пока результат не будет нулевым. Если бы я знал немного больше о вашей программе, я мог бы быть более конкретным. Что вам нужно делать в вашей деятельности между опросами? – Jay

+0

Кроме того, почему именно вы хотите, чтобы ваша активность запускала ResultChecker в отдельном потоке, а не в Activity? – Jay

0

создать обработчик в исходной резьбе. затем отправьте сообщение об этом обработчике, когда вы хотите вернуть значение; сообщение может содержать произвольный объект, который будет результатом. Обработчик выполнит его метод handleMessage в исходном потоке, где вы можете проверить отправленное сообщение и отреагировать на результат.

0

Я не могу понять, что вы имеете в виду ** постоянный **

Что случилось с этим?

public Boolean call() { .. do something.. 
     return bool;  } 
+0

Потому что он проверяет только один раз drawView.isNextQuestion() и возвращает false. Но это значение может измениться, и это может измениться, поэтому Thread должен проверить его до тех пор, пока я не закончу его – krackmoe

+0

Я не уверен, что это хорошая идея, но вы также можете попробовать установить переменную поля внутри условия if , 'if (cond) {использовать setter для установки поля var здесь.}' –

0

Есть два способа получить возвращаемое значение обратно к исходной теме:

  1. Исходный поток может периодически опрашивать ResultChecker, чтобы увидеть, если возвращаемое значение доступно.
  2. Исходная нить может блокироваться, и ResultChecker пробудит исходную тему, когда захочет вернуть значение.

Если вы сообщите мне, какой метод вы предпочитаете, я могу дать вам подробную информацию.

+0

Но у меня нет оригинальной Thread. У меня есть активность, в которой я начинаю эту тему. Вы имеете в виду, что я должен сделать Thread в теме? Но я бы предпочел первый метод .. – krackmoe

+0

Под «исходной нитью» я имел в виду, что когда-либо вы хотите вернуть значение. Не имеет значения, в какой поток будет идти результат. Единственное, что имеет значение, это то, что значение отправляется в другой поток. – Jay

+0

Хорошо, не могли бы вы рассказать мне, как это сделать с помощью метода Nr.1 ​​ – krackmoe

Смежные вопросы