2017-11-17 33 views
-2

私は、スレッドがカウントしてボタンのテキストを変更し、それらを無効にするアプリケーションを開発しています。私はウォン()メソッドを実行している間にスレッドによって引き起こされるエラーを取得している、私はスレッドがボタンのテキストの変更を処理できないと思う。 UIスレッドまたはそれを処理できるスレッドにどのように渡すことができますか?Androidスレッドの例外

import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import java.util.concurrent.TimeUnit; 
    public class vTap extends AppCompatActivity { 

int level = 0, i = 0, j = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    pll(); 

} 

public void pll(){ 
    Thread t = new Thread(){ 
     public void run(){ 
      while(won()){ 
       i++; 
       try{ 
        sleep(50); 
       } 
       catch (InterruptedException e){ 

       } 
      } 

     } 
    }; 
    t.start(); 
} 

public boolean won(){ 
    if(i == 20 || j == 20){ 
     ((Button)findViewById(R.id.p1)).setEnabled(false); 
     ((Button)findViewById(R.id.p2)).setEnabled(false); 
     if(i == 20){ 
      ((Button) findViewById(R.id.p2)).setText("You\nLost"); 
      ((Button) findViewById(R.id.p1)).setText("Com\nWon"); 

     } else { 
      ((Button) findViewById(R.id.p2)).setText("You\nWon"); 
      ((Button) findViewById(R.id.p1)).setText("Com\nLost"); 
     } 
     return false; 
    } 
    else 
     return true; 
} 

    } 

エラーが表示されるアプリケーションがクラッシュしています。

E/AndroidRuntime: FATAL EXCEPTION: Thread-19 
       Process: com.example.k.tap, PID: 30778 
       android.util.AndroidRuntimeException: Animators may only be run on Looper threads 
        at android.animation.AnimatorSet.start(AnimatorSet.java:705) 
        at android.animation.AnimatorSet.start(AnimatorSet.java:684) 
        at android.animation.StateListAnimator.start(StateListAnimator.java:188) 
        at android.animation.StateListAnimator.setState(StateListAnimator.java:181) 
        at android.view.View.drawableStateChanged(View.java:20049) 
        at android.widget.TextView.drawableStateChanged(TextView.java:5000) 
        at android.support.v7.widget.AppCompatButton.drawableStateChanged(AppCompatButton.java:155) 
        at android.view.View.refreshDrawableState(View.java:20104) 
        at android.view.View.setEnabled(View.java:9448) 
        at android.widget.TextView.setEnabled(TextView.java:2196) 
        at com.example.k.tap.vTap20.won(vTap.java:111) 
        at com.example.k.tap.vTap20$1.run(vTap.java:44) 
    D/AppTracker: App Event: crash 
    D/AppTracker: App Event: stop 
+0

他のスレッドでそれをやろうとすると、メインスレッドのビューを変更/変更できます。アンドロイドは例外をスローします。 –

答えて

1

あなたは下記の方法で行う必要があるので、UIスレッド上で、あなたのUI要素を更新する必要があります。

public boolean won() 
{ 
if(i == 20 || j == 20) 
{ 
    ((Button)findViewById(R.id.p1)).setEnabled(false); 
    ((Button)findViewById(R.id.p2)).setEnabled(false); 
    if(i == 20) 
    { 
     getActivity().runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      ((Button) findViewById(R.id.p2)).setText("You\nLost"); 
      ((Button) findViewById(R.id.p1)).setText("Com\nWon"); 
     } 
    }); 

    } 
    else 
    { 
     getActivity().runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 

      ((Button) findViewById(R.id.p2)).setText("You\nWon"); 
      ((Button) findViewById(R.id.p1)).setText("Com\nLost"); 
     } 
    }); 

    } 
    return false; 
} 
else 
    return true; 
} 
0

私は答えを得た、あなたの応答のための 感謝を。

public boolean won(){ 
    if(i == 20 || j == 20){ 
     new Handler(Looper.getMainLooper()).post(new Runnable() { 
      @Override 
      public void run() { 
       ((Button)findViewById(R.id.p1)).setEnabled(false); 
       ((Button)findViewById(R.id.p2)).setEnabled(false); 
       if(i == 20){ 
        ((Button) findViewById(R.id.p2)).setText("You\nLost"); 
        ((Button) findViewById(R.id.p1)).setText("Com\nWon"); 

       } else { 
        ((Button) findViewById(R.id.p2)).setText("You\nWon"); 
        ((Button) findViewById(R.id.p1)).setText("Com\nLost"); 
       } 
      } 
     }); 
     return false; 
    } 
    else 
     return true; 
} 

ありがとうございます!

関連する問題