2017-03-16 2 views
1

Bevor Sie die Frage stellen lassen Sie mich Ihnen sagen, dass ich neu in Android-Entwicklung bin. Meine Frage bezieht sich auf Threads und wait(); Funktion. Im Moment versuche ich den Thread zu implementieren, der die Farbe des Textes alle 3 Sekunden ändern sollte, aber das Programm stürzt ab, sobald ich es starte. Hier ist der Code.wait() Funktion funktioniert nicht in Thread in android Studio

package care.client_application; 

public class MainActivity extends AppCompatActivity { 
    Thread Thread3=null; //Coloring thread 
    public TextView Warning; 

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

     Warning= (TextView) findViewById(R.id.warning); 
     UIHandler = new Handler(); //Initialization of handler 

     this.Thread3= new Thread(new Thread3()); 
     this.Thread3.start(); 
    } 

    class Thread3 implements Runnable{ 
     @Override 
     public void run() { 
     Warning.setTextColor(Color.rgb(200,200,0)); 
     wait(3000); 
     Warning.setTextColor(Color.rgb(200,0,0)); 
     } 
    } 
} 
+1

Veröffentlichen Sie Ihren Fehler –

+0

Fehler möglicherweise, nur der Thread, der die Ansicht erstellte kann es ändern. Habe ich recht? –

Antwort

1

Ich möchte

alle 3 Sekunden die Farbe des Textes ändern Warum nicht ein Handler statt verwenden Thread

private Runnable task = new Runnable() { 
    public void run() { 
      //update textview color 
      Warning.setTextColor(Color.rgb(200,200,0)); 
      mHandler.postDelayed(task, 3000); //repeat task 
    } 
}; 

Nennen Sie es mit:

private Handler mHandler = new Handler(); 
// call updateTask after 3 seconds 
mHandler.postDelayed(task, 3000); 

zu Stoppen Sie die Aufgabe:

@Override 
protected void onPause() { 
    mHandler.removeCallbacks(task); 
    super.onPause(); 
} 
+0

Es wird unendlich lange iterieren –

+0

deshalb habe ich die 'onPause' Bedingung hinzugefügt ... – rafsanahmad007

+0

Danke Bruder für einfache und effektive Lösung –

0

allererst Sie keine UI-Komponente auf Run-Methode von Thread aktualisieren können wie Ihre

Warning.setTextColor(Color.rgb(200,200,0)); // this wrong way to do this 

Verwenden Handler tun

1
public class MainActivity extends AppCompatActivity { 

    private TextView warningText; 
    private final long TIME_TO_CHANGE = 3000; 
    private Handler handler = new Handler(); 
    private int counter = 0; 
    private int[] R = {0, 200}, G = {0, 200}, B = {200, 0}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     warningText = (TextView) findViewById(R.id.warning); 
     warningText.setTextColor(Color.rgb(0,0,0)); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       updateTextColor(); 
       handler.postDelayed(this, TIME_TO_CHANGE); 
      } 
     }, TIME_TO_CHANGE); 
    } 

    private void updateTextColor(){ 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       counter = (counter+1)%2; 
       warningText.setTextColor(Color.rgb(R[counter],G[counter],B[counter])); 
      } 
     }); 
    } 

    @Override 
    public void onPause(){ 
     super.onPause(); 
     handler.removeCallbacksAndRunnables(null); 
    }   

} 

Verwenden Handlers beliebigen UI-Update durchzuführen für Aufgaben, die warten müssen. Thread.sleep() wird in Android nicht empfohlen.

0

Erstens, Sie sollten nicht verwenden, dass es friert und das ist kein guter Ansatz. Zweitens, wenn Sie dies tun müssen, dann müssen Sie verwenden runonuithread als ui auf der Laufzeit ändern müssen Sie diese wie tun:

class Thread3 implements Runnable{ 
     @Override 
     public void run() { 
     getActivity().runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
      Warning.setTextColor(Color.rgb(200,200,0)); 
      } 
     }); 
     wait(3000); 
getActivity().runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
      Warning.setTextColor(Color.rgb(200,0,0)); 
      } 
     }); 

     } 

Ich hoffe, es hilft Ihnen, mich zu lassen wissen, ob es funktioniert. Viel Glück.

Verwandte Themen