2016-04-25 4 views
0

Hallo, ich mache ein Quiz-Spiel, und ich habe ein Problem, ich werde versuchen, auf eine einfachere Weise unten zu beschreiben.Ich habe eine Frage und 4 Tasten jeder eine Antwort darstellt.Wenn ich klicke auf eine antwort Ich möchte mit der gewählten Taste die Farbe für 2 Sekunden in Orange ändern und wird dann grün, wenn die Antwort richtig ist und rot, wenn die Antwort falsch ist und die richtige Antwort auch grün wird und für weitere 2 Sekunden in dieser Situation bleibt bringen Sie die neue Frage und alle Knöpfe nehmen ihre vorherige (defaut) Farbe.Stoppen Sie die Ausführung für einen Zeitraum von Zeit in Java

Ich habe viele Möglichkeiten wie TimeUnit.SECONDS.sleep(2);, Thread.sleep(2000); und einige mehr versucht, aber die Änderungen erscheint nach dieser Zeit.Wenn ich jetzt und für die nächsten 2 Sekunden erscheint.

Last Weise habe ich versucht, ist ein Zeitgeber wie folgt aus:

 long startTime = System.currentTimeMillis(); 
    long endTime = startTime + 2*1000; // 2 seconds * 1000 ms/sec 
    while (System.currentTimeMillis() < endTime) 
    { 

    } 

für 2 Sekunden, um die Ausführung in der while-Schleife zu stoppen. Ich machte eine einfachere Anwendung mit einer Taste, um das Problem im Forum zu beschreiben. Ich will, wenn ich auf den Knopf klicke, ändert sich die Farbe der Taste für 2 Sekunden zu Rot und nahm dann die vorherige Farbe wieder. Hier ist der Java-Code:

package com.example.sakis.fillbutton; 

import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

import java.util.Timer; 
import java.util.TimerTask; 
import java.util.concurrent.TimeUnit; 

public class MainActivity extends AppCompatActivity { 

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

    but=(Button)findViewById(R.id.button); 
    but.setBackgroundResource(R.drawable.colorbut); 


} 




public void ClickButton(View view) { 




    but.setBackgroundResource(R.drawable.initcolor); 

    long startTime = System.currentTimeMillis(); 
    long endTime = startTime + 2*1000; // 2 seconds * 1000 ms/sec 
    while (System.currentTimeMillis() < endTime) 
    { 

    } 


    but.setBackgroundResource(R.drawable.colorbut); 

} 

}

Hier ist der XML-Code:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.sakis.fillbutton.MainActivity"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello World!" 
    android:id="@+id/textView" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:id="@+id/button" 
    android:layout_below="@+id/textView" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="88dp" 
    android:onClick="ClickButton" 
    style="@style/ButtonAnswer"/> 

Bitte helfen.

Antwort

4
while (System.currentTimeMillis() < endTime) {} 

Busy Schleifen sind das Schlimme. TU das niemals. Wiki quote:

Im Allgemeinen [...] Spinn betrachtet wird ein Anti-Muster und soll vermieden werden, als Prozessorzeit, die verwendet werden könnte eine andere Aufgabe verschwendet wird stattdessen auf nutzlose Aktivität auszuführen.

Zurück zur Frage:

Wenn ich eine Antwort ich auf die gewählte Taste Farbe ändern 2 Sekunden bis orange wollen und dann grün wird, wenn die Antwort richtig und rot, wenn die Antwort

Sie können Runnable verwenden und es mit der erforderlichen Verzögerung buchen, ohne dass Sie sich zu viele Sorgen machen müssen. Wenn die Verzögerung vorüber ist, wird Ihre Runnable behandelt.fügen Sie diese einfach an Ihre Klasse Mitglieder:

Handler mHandler = new Handler(); 

und dann erstellen und nach dem runnable mit der Handhabung so viel verzögert je nach Bedarf:

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     changesColorsToGreenOrRed(); 
    } 
}; 
mHandler.postDelayed(runnable, 2000); 

und bleibt für weitere 2 Sekunden, um diese Situation vor bringen Die neue Frage

Die changesColorsToGreenOrRed() sollte ihre Arbeit tun und dann einfach eine andere Runnable post.

+0

Die Antwort ist offensichtlich richtig, würde aber durch eine Erklärung verbessert, warum belegte Schleifen schlecht sind. – nhouser9

+0

https://en.wikipedia.org/wiki/Busy_waiting "Im Allgemeinen wird das Drehen jedoch als Anti-Pattern betrachtet und sollte vermieden werden, da die Prozessorzeit, die zur Ausführung einer anderen Aufgabe verwendet werden könnte, stattdessen für nutzlose Aktivitäten verschwendet wird. " –

+0

Danke Mann, es funktioniert !!! –

Verwandte Themen