2013-02-20 3 views
20

Я только начинающий так пожалуйста, прости меня за вопрос, возможно, глупый вопросТолько исходный поток, создавший иерархию представлений, может коснуться его представлений. На андроид


Я не понимаю смысл только оригинальный поток, который создал иерархию вида может коснуться его точки зрения.

Пожалуйста, кто-нибудь научит меня, почему эта ошибка возникает и как решить эту проблему.

ThankYou

Это мой класс

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

И это мой LogCat

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

Изменить ваш startingUp() к этому.

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

Вы не можете изменить текст с title.clearComposingText(); внутри нити, потому что вы можете только изменить взгляды из потока пользовательского интерфейса. Вместо этого используйте обработчик и позвольте ему изменить текст.

2

Вы не должны обновить TextView из другого потока, чем UI thread.You может использовать AsyncTask для this.Can см this

2

Как уже отмечалось, вы не можете изменить пользовательский интерфейс из фоновой темы.

Вы можете использовать AsyncTask, или использовать метод Activity.runOnUiThread()

11

Это исключение не подходит из-за title.clearComposingText(). Даже эта строка не полезна, мы можем удалить эту строку. Это исключение входит в функцию title(), потому что не UI-Thread пытается изменить представление. , поэтому нам нужно вызвать эту функцию в редакторе UI Threading или Handler.

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(); 
    } 
Смежные вопросы

 Смежные вопросы