2017-03-13 9 views
1

Android Studio의 작업 스레드가 작동하는 방식을 찾으려고합니다.Android : 간단한 스레드 예가 충돌

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(); 

    } 

} 

및 XML 코드는 다음과 같습니다 : 나는 간단한 예제를 생성하지만 다음과 같은 문제로 어려움을 겪고있어, 자바 코드는

<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> 

코드는 확인을 구축하지만, 버튼을 클릭하면 다음 오류로 인해 앱이 다운 됨 :

Button has stopped. 
+5

전체 스택 추적을 게시하십시오. – m0skit0

답변

2

핸들러는

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

스레드 시작! – m0skit0

+0

하지만 다른 Runnable을 만드는 Runnable을 만드는 이유는 무엇입니까? 하나의 Runnable enaugh가 아닌가요? - 그냥 묻는, 난 안드로이드 전문가가 아니에요 – BackSlash

+0

실제로 우리가 그것을 사용하여 UI와 상호 작용하려고 할 때 그것은 예외를 일으키는 –

0

당신은 비 UI 스레드에서 UI 작업을 할 수 없어 지금은 UI 구성 요소 작업 (실행 가능) runOnUiThread를 사용합니다.

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

를하지만 좋은 다시 생각하고 당신은 그것을 더 우아한 해결책을 쓸 수 있습니다 : 이런 식으로 포장하려고합니다.