2017-03-13 4 views
1

Ich versuche herauszufinden, wie funktioniert der Arbeitsfaden in Android Studio arbeiten. Ich ein einfaches Beispiel erstellt, aber ich bin zu kämpfen mit folgenden Fragen, der Java-Code ist:Android: Einfacher Thread Beispiel Absturz

package tlacitko.button; 

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

public class MainActivity extends AppCompatActivity { 

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

    public void sendMessage(View view) { 
     new Thread(new Runnable() { 
      public void run() { 
       Toast.makeText(getBaseContext(), "Your answer is correct!" , Toast.LENGTH_SHORT).show(); 
      } 
     }).start(); 

    } 

} 

und der XML-Code ist:

<TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="7dp" 
     android:layout_marginTop="16dp" 
     android:onClick="sendMessage" 
     android:text="Ahoj" 
     app:layout_constraintLeft_toRightOf="@+id/editText" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 


</android.support.constraint.ConstraintLayout> 

Der Code baut, ist in Ordnung, aber Nach dem Klick auf die Schaltfläche stürzt die App mit folgendem Fehler ab:

Button has stopped. 
+5

Veröffentlichen Sie den gesamten Stacktrace des Fehlers. – m0skit0

Antwort

2

müssen Sie verwenden Handler für jetzt mit UI-Komponenten zu arbeiten, verwenden runOnUiThread (runnable)

public class MainActivity extends AppCompatActivity { 

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

     public void sendMessage(View view) { 
      new Thread(new Runnable() { 
       public void run() { 


        runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(getBaseContext(), "Your answer is correct!" , Toast.LENGTH_SHORT).show(); 
       } 
      }); 
       } 
      }).start(); 

     } 

    } 
+0

Fadenanfang! – m0skit0

+0

Warum aber ein Runnable erstellen, das ein anderes Runnable erzeugt? Ist nicht ein Runable enaugh? - Ich frage nur, ich bin kein Android-Experte – BackSlash

+0

tatsächlich, wenn wir versuchen, mit ui zu interagieren mit Thread verursachen Exception –

0

Sie können nicht UI Arbeit aus nicht UI-Thread tun. Versuchen Sie es so wickeln:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(getBaseContext(), "Your answer is correct!" , Toast.LENGTH_SHORT).show(); 
    } 
}); 

Aber denken Sie noch einmal ist es gut und können Sie schreiben elegantere Lösung für sie.