2013-02-20 9 views
20

に私は初心者ですので、おそらく愚かな質問ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。アンドロイド


を尋ねるために私を許してください、私はビュー階層は、その見解に触れることができます作成​​しただけ元のスレッドの意味を理解していません。

なぜこのエラーが発生しているのか、この問題を解決する方法を教えてください。

ありがとう

これは

public class MainActivity extends Activity { 
    TextView title; 
    Random random = new Random(); 
    int  counter = 1; 

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

    private void startingUp() { 
     Thread timer = new Thread() { //new thread   
      public void run() { 
       Boolean b = true; 
       try { 
        do { 
         counter++; 
         title(); 
         sleep(1000); 
         title.clearComposingText(); 

        } 
        while (b == true); 
       } catch (IntruptedException e) { 
        e.printStackTrace(); 
       } 
       finally { 
       } 
      }; 
     }; 
     timer.start(); 
    } 

    public void title() { 
     title = (TextView) findViewById(R.id.tvTitle); 
     switch (random.nextInt(2)) { 
      case 0: 
       title.setGravity(Gravity.RIGHT); 
       break; 
      case 1: 
       title.setGravity(Gravity.CENTER); 
       break; 
      case 2: 
       title.setGravity(Gravity.LEFT); 
       break; 
     } 
     title.setTextColor(Color.rgb(random.nextInt(250), random.nextInt(250), random.nextInt(250))); 
     title.setTextSize(random.nextInt(55) + 10); 
    } 
} 

私のクラスであり、これはあなただけのビューを変更することができますので、あなたは、スレッド内のtitle.clearComposingText();でテキストを変更することはできません

02-20 10:53:19.293: I/Adreno200-EGLSUB(5816): <ConfigWindowMatch:2078>: Format RGBA_8888. 
02-20 10:53:19.303: D/memalloc(5816): /dev/pmem: Mapped buffer base:0x5c914000 size:14135296 offset:10366976 fd:64 
02-20 10:53:19.303: E/(5816): Can't open file for reading 
02-20 10:53:19.303: E/(5816): Can't open file for reading 
02-20 10:53:19.303: D/OpenGLRenderer(5816): Enabling debug mode 0 
02-20 10:53:19.373: D/memalloc(5816): /dev/pmem: Mapped buffer base:0x5db58000 size:3768320 offset:0 fd:67 
02-20 10:53:20.143: W/dalvikvm(5816): threadid=11: thread exiting with uncaught exception (group=0x40abc210) 
02-20 10:53:20.143: E/AndroidRuntime(5816): FATAL EXCEPTION: Thread-3102 
02-20 10:53:20.143: E/AndroidRuntime(5816): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:722) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:771) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:4112) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.View.invalidate(View.java:8639) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.view.View.invalidate(View.java:8590) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at android.widget.TextView.setGravity(TextView.java:2538) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at com.example.saikoro.MainActivity.title(MainActivity.java:58) 
02-20 10:53:20.143: E/AndroidRuntime(5816):  at com.example.saikoro.MainActivity$1.run(MainActivity.java:36) 
+4

私はここでUIスレッドの概念を学ぶ必要があると思います。 http://developer.android.com/guide/components/processes-and-threads.html – Rajnikant

+0

ありがとうございます。しかし、この問題を解決するために何をする必要がありますか? –

+1

申し訳ありません昨日stackoverflowを使い始めたので、何が起こっているのか分かりません –

答えて

27

の変更を参照してくださいthis.Canためasynctaskを使用することができますUI thread.You以外のスレッドからのTextViewを更新してはいけません。

private void startingUp() { 
    Thread timer = new Thread() { //new thread   
     public void run() { 
      Boolean b = true; 
      try { 
       do { 
        counter++; 
        title(); 
        sleep(1000); 

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

         title.clearComposingText(); 
        } 
       }); 


       } 
       while (b == true); 
      } catch (IntruptedException e) { 
       e.printStackTrace(); 
      } 
      finally { 
      } 
     }; 
    }; 
    timer.start(); 
} 

あなたは非UIスレッドからの景色を変更することはできません。

2

私LogCatでありますUIスレッドから取得します。代わりにハンドラを使用して、テキストを変更させます。

2

すでに述べたように、UIをバックグラウンドスレッドから変更することはできません。

あなたは

11

AsyncTaskを使用するか、またはActivity.runOnUiThread()メソッドを使用するか、この例外は、()によるtitle.clearComposingTextに来ていません。 この行でさえ便利でない場合、この行を削除できます。 この例外は、非UIスレッドがビューを変更しようとしているため、title()関数に入っています。 この関数は、UIスレッドまたはハンドラで呼び出す必要があります。

private void startingUp() { 
     Thread timer = new Thread() { //new thread   
      public void run() { 
       boolean b = true; 
       try { 
        do { 
         counter++; 

         sleep(1000); 
         runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
            title(); 
           //title.clearComposingText();//not useful 

          } 
         }); 


        } 
        while (b == true); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       finally { 
       } 
      }; 
     }; 
     timer.start(); 
    } 
関連する問題