2015-09-19 2 views
-1

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

@Override 
     public boolean onTouchEvent(MotionEvent event) 
     { 
      float eventX = event.getX(); 
      float eventY = event.getY(); 

      float lastdownx = 0; 
      float lastdowny = 0; 

      switch (event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
        lastdownx = eventX; 
        lastdowny = eventY; 

        Thread t = new Thread(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          byte[] response = null; 
          if (connectedtoipsuccess == true) 
          { 

           if (is_start == true) 
           { 
            response = Get(iptouse + "start"); 
            is_start = false; 
           } else 
           { 
            response = Get(iptouse + "stop"); 
            is_start = true; 
            servercheckCounter = 0; 
           } 
           if (response != null) 
           { 
            String a = null; 
            try 
            { 
             a = new String(response, "UTF-8"); 
             if (a.equals("Recording started")) 
             { 
              status1.setText("Recording"); 
             } 
             if (a.equals("Recording stopped and preparing the file to be shared on youtube")) 
             { 
              status1.setText("Recording Stopped"); 
             } 
             textforthespeacch = a; 
             MainActivity.this.initTTS(); 
            } catch (UnsupportedEncodingException e) 
            { 
             e.printStackTrace(); 
            } 
            Logger.getLogger("MainActivity(inside thread)").info(a); 
           } 
          } 
         } 
        }); 
        t.start(); 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        break; 
       case MotionEvent.ACTION_UP: 
        break; 
       default: 
        return false; 
      } 
      return true; 
     } 

Исключение haapen после этой строки:

a = new String(response, "UTF-8"); 

Или строк:

status1.setText("Recording"); 

STATUS1 является TextView и в OnCreate я сделал:

status1 = (TextView) findViewById(R.id.textView3); 

Сделать сбой программы. Сообщение eexception от LogCat:

09-19 10:22:18.458 19836-20124/com.test.webservertest E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-78258 
    Process: com.test.webservertest, PID: 19836 
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
      at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6334) 
      at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:890) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360) 
      at android.view.View.requestLayout(View.java:17407) 
      at android.widget.TextView.checkForRelayout(TextView.java:7054) 
      at android.widget.TextView.setText(TextView.java:4186) 
      at android.widget.TextView.setText(TextView.java:4044) 
      at android.widget.TextView.setText(TextView.java:3999) 
      at com.test.webservertest.MainActivity$6.run(MainActivity.java:633) 
      at java.lang.Thread.run(Thread.java:818) 
+0

Вы пытаетесь изменить элемент пользовательского интерфейса из потока без пользовательского интерфейса. На Android вы не можете этого сделать. –

+0

Возможный дубликат [Android «Только исходный поток, создавший иерархию представлений, может коснуться его представлений».] (Http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-created- а-вид-иерархии, может-сенсорный его-VI) – Henry

ответ

0

Сообщение об ошибке гласит: «Только оригинальный поток, который создал иерархию вида может коснуться его точки зрения.» Глядя на вашу программу, вы на самом деле пытаетесь установить текст на каком-то представлении в потоке, который не является основным потоком.

В подобных ситуациях вы можете использовать the runOnUiThread() method.

Например:

runOnUiThread(new Runnable() { 
    status1.setText("Recording"); 
}); 
Смежные вопросы

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