0

相対レイアウトで最初に緑を設定し、白を設定した後、相対レイアウトの背景色を変更しようとしていますが、問題のスレッドが2回実行され、強制終了エラーが発生し、多くの方法を修正しようとしましたが、機能しません。これが私のコードです:

       isThreadRunning = true;
       relative=(RelativeLayout) findViewById(R.id.layout);
       Runnable runnable = new Runnable() {
                 public void run() {
                   int i=0;
                   while(isThreadRunning) {
                       if(i==0)
                       {
                       relative.setBackgroundColor(Color.GREEN);
                       i=1;
                       }
                       else
                       {
                         relative.setBackgroundColor(Color.BLACK);
                         i=0;
                       }
                       try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 

                   }
               }
               };
               new Thread(runnable).start();

そして私は以下のようなlogcatでエラーが発生しています:

07-10 17:48:42.752: W/dalvikvm(2060): threadid=9: thread exiting with uncaught exception (group=0x40015560)
07-10 17:48:42.756: E/AndroidRuntime(2060): FATAL EXCEPTION: Thread-10
07-10 17:48:42.756: E/AndroidRuntime(2060): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.View.invalidate(View.java:5279)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.View.setBackgroundDrawable(View.java:7626)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at android.view.View.setBackgroundColor(View.java:7516)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at com.example.screen_blinker.Home_activity$1.run(Home_activity.java:44)
07-10 17:48:42.756: E/AndroidRuntime(2060):     at java.lang.Thread.run(Thread.java:1019)

私のコードの何が問題になっていて、この問題を修正する方法は?

前もって感謝します!

4

3 に答える 3

0

ビュー要素はメインスレッドでのみ変更できます。別のスレッドにいる場合は、次を使用してください。

    Current_Activity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

                }
            });
于 2012-07-10T12:33:26.130 に答える
0

GUIスレッドでGUI関連のタスクを実行する必要があります。

そのようにあなたrelative.setBackgroundColor(Color.GREEN);を包みます:runOnUiThread

Current_Activity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            relative.setBackgroundColor(Color.GREEN);               
        }
于 2012-07-10T12:33:40.030 に答える
0

非UIスレッドからUI要素を更新するためにrunOnUiThreadを使用するようにコードを変更します。

public void myThread(){
    Thread th=new Thread(){

     @Override
     public void run(){
      try
      {
       while(isThreadRunning)
       {
       Thread.sleep(1000);
       Current_Activity.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
         // TODO Auto-generated method stub
             if(i==0)
            {
               relative.setBackgroundColor(Color.GREEN);
               i=1;
            }
            else
              {
               relative.setBackgroundColor(Color.BLACK);
               i=0;
              }

           }
       });
       }
      }catch (InterruptedException e) {
    // TODO: handle exception
   }
}
    };
    th.start();
   }
于 2012-07-10T12:34:26.833 に答える