2017-11-21 2 views
0

Ich versuche einen Thread zu haben, der 3 Sekunden lang auf Benutzereingaben wartet, wenn der Benutzer auf die Schaltfläche "execute" klickt und wenn er nicht in 3 Sekunden klickt, führe "not" aus. Ich habe stackoverflow durchsucht, konnte aber keine exakte und vereinfachte Antwort finden. Sorry, wenn dies eine Wiederholungs- und/oder Noob-Frage ist.Thread Stopping und Methodenausführung

Hier ist der Code, den ich für den Moment habe, aber fühlen Sie sich frei, mir einen anderen Weg anzubieten, konnte es damit nicht lösen;

private Thread thread; 
TextView maintext; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final MainActivity myActivity = this; 

    maintext = (TextView) findViewById(R.id.mainText); 

} 



public void start(View view){ 

    changeText("Waiting."); 
    thread= new Thread(){ 
     @Override 
     public void run(){ 
      try { 
       synchronized(this){ 
        wait(3000); 

       } 

      } 

      catch(InterruptedException ex){ 

      } 

     } 
    }; 
    thread.start(); 


} 

public void done(){ 
    maintext.setText("You pressed the button in 3 seconds"); 
} 

public void not(){ 
    maintext.setText("You failed"); 
} 

public void changeText(String text){ 

    maintext.setText(text); 

} 

public void click(View view){ 

    synchronized(thread){ 
     thread.notifyAll(); 

    } 
} 
+1

Bitte beschreiben Sie das Problem. Es ist nicht klar, was falsch ist. –

Antwort

0

Wie wäre es mit einem CountDownLatch?

Construction (in der Klasse Instanz Variablendeklaration, also der Ort, an dem thread jetzt erklärt wird):

CountDownLatch latch = new CountDownLatch(1); 

In Ihrem wartenden Thread (genannt start), statt der Schaffung und beginnen, dass Thread:

// wait for it to be notched or for timeout 
boolean buttonPressed = latch.await(3, TimeUnit.SECONDS); 
if (buttonPressed) { 
    .... 
} 

Und in Ihrem Button klicken Hörer (das ist nicht in Ihrem Beitrag angezeigt, ist es in der Regel konfiguriert wie clickButton.setOnClickListener(new OnClickListener() {):

latch.countDown(); 

Später zusätzlich

Bitte beachten Sie jedoch, dass, wenn das start() Verfahren in einem UI-Thread ausgeführt wird, wird einfach darauf warten, um die UI einfrieren das ist nicht das, was Sie wollen. Ein anderer Ansatz wäre, etwas wie Ereignisse zu verwenden. Definieren Sie zwei Ereignisse: 'drei Sekunden bestanden' und 'die Schaltfläche wurde gedrückt' und verarbeiten Sie sie.

Instanzvariablen:

private boolean buttonPressed = false; 
private boolean expired = false; 
private final Object monitor = new Object(); 

Timer Initialisierung:

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     synchronized (monitor) { 
      if (!buttonPressed) { 
       // change text to 'You failed' 
       expired = true; 
       timer.cancel(); 
      } 
     } 
    } 
}, 3000); 

In Ihrer Klick Hörer-Taste:

synchronized (monitor) { 
    if (!expired) { 
     // change text to 'You pressed the button in 3 seconds' 
     buttonPressed = true; 
     timer.cancel(); 
    } 
} 

Es gibt keine Notwendigkeit, jeden Thread zu blockieren.

+0

Vielen Dank für die schnelle Antwort, aber ich konnte dies nicht implementieren, da es das erste Mal ist, dass ich versuche, ein CountDownLatch zu verwenden. Ich lese das Javadoc davon, verstehe aber immer noch nicht, wie ich das in meinem Code verwenden soll. Tut mir leid, so noob zu sein :)) Kannst du das in den Code, den ich hier eingefügt habe, implementieren, damit ich sehe, wie man es benutzt? – KorhanK

+0

Noch ein wenig ausgearbeitet –

+0

Funktioniert immer noch nicht. Vielleicht eine Lösung mit Thread? – KorhanK

0

Kann sein, diese Antwort wird Ihnen helfen,

private boolean isActive; //globally declare 

    changeText("Waiting."); 
    Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      if (!isActive) { 
       isActive = true; 
      } 
     } 
    }; 
    handler.sendEmptyMessageDelayed(0,3000); 

public void onClick(View v) { 
    if (!isActive) { 
     done(); 
    } else { 
     not(); 
    } 
} 



public void done() { 
    mainText.setText("You pressed the button in 3 seconds"); 
} 

public void not() { 
    mainText.setText("You failed"); 
} 

public void changeText(String text) { 
    mainText.setText(text); 
} 

Ich hoffe, dass dies Ihr Problem lösen wird.

Verwandte Themen