2017-03-13 4 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コードは次のとおりです:私は簡単な例を作成しましたが、私は次の問題に苦しんだ、Javaコードがある

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

コードがOK構築ですが、ボタンをクリックすると、次のエラーでアプリがクラッシュする:

Button has stopped. 
+5

エラーのstacktrace全体をポストします。 – m0skit0

答えて

2

現在のUIコンポーネントを処理するハンドラ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

スレッド開始! – m0skit0

+0

しかし、なぜ別のRunnableを作成するRunnableを作成するのですか? 1つのRunnableがうまくいきませんか? - ただ質問する、私はアンドロイドの専門家ではない – BackSlash

+0

実際に私たちがUIを使ってインタラクトしようとすると、それは例外を引き起こす –

0

UI以外のスレッドからはUIを操作できません。 このようにそれを包むようにしてください:

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

しかし、再び、それは良いですが、あなたはそれのために、よりエレガントなソリューションを書くことができると思います。

関連する問題