2016-05-18 3 views
0

Ich versuche, meine Farbe der Startbutton innerhalb zu ändern:Aufruf der Methode aus onClick (Blick v) Schalter (v.getId()

onClick(View v) { 
    switch (v.getId()) { 
    case R.id.startButton: 
    startButton.setTextColor(Color.RED); 

    listenForNoise(); 
    break;} 
} 

private void listenForNoise(){ 
    /////****** 
return 

aber es ändert sich nur, wenn meine Methode listenForNoise kehrt So gibt es. eine Verzögerung (Methode hat einen Trigger-Schleife) Wie cam ich die Farbe wechseln machen auf Knopfdruck

+0

Falle keine lange Aufgaben in Ihrem UI-Thread (wie eine Schleife, die darauf wartet, dass etwas passiert). Verwenden Sie etwas wie AsyncTask – vilpe89

Antwort

1

Sie anrufen können „listenForNoise();“ innerhalb anderer Thread, etwas, was wie folgt aus:.?

onClick(View v) { 
switch (v.getId()) { 
case R.id.startButton: 
startButton.setTextColor(Color.RED); 
new Thread(new Runnable() { 
     public void run(){   
listenForNoise(); 
     } 
    }).start(); 
break;} 
} 
private void listenForNoise(){ 
/////****** 
return 
} 
0

onClick wird vom main/event/ui-Thread aufgerufen. Es ist in Ordnung, dass Sie die Eigenschaft startButtons Textfarbe aus diesem Thread aktualisieren, aber Sie wollen keine Arbeit oder io machen.

Wenn die Methode listentForNoise über Code verfügt, der auch eine andere Ansichtseigenschaft ändert und im selben Thread ausgeführt werden muss, können Sie mit einem Runnable schreiben.

startButton.post(new Runnable() { 
    @Override 
    public void run() { 
     listenForNoise(); 
    } 
}) 

Oder einen neuen Thread erstellen, um die Methode

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     listenForNoise(); 
    } 
}).start(); 

oder verwenden Sie eine AsyncTask aufzurufen (schauen Sie in Rx Java für einen anderen Ansatz)

AsyncTask<Void, Void, Void> { 

    protected Result doInBackground(String... someData) { 
    // Any non blocking code for listenForNoise should go here 
    return; 
    } 

    protected void onPostExecute(Void result) { 
    // Any code that updates UI in listenForNoise should go here. 
    }