2014-03-02 5 views
0

제목과 마찬가지로 MainActivity 클래스가있는 Android 프로젝트에 메시지를받은 후 텍스트를 설정하려는 TextView가 있습니다. 또한 표시하려는 문자열 메시지를받는 별도의 스레드에서 ServerSocket을 실행하는 클래스가 있습니다. 내 MainActivity의보조 스레드의 주 스레드에서 인수가있는 호출 방법

일부는 다음과 같습니다

private Handler UIHandler = new Handler(); 
private RemoteControlServer remoteConnection; 
public static final int controlPort = 9090; 
public class MainActivity extends Activity implements SensorEventListener 
{ 
    ... 

    remoteConnection = new RemoteControlServer(controlPort, UIHandler); 

    ... 

    private class RemoteControlServer extends RemoteControl 
    { 
     RemoteControlServer(int port, Handler ui) 
     { 
      super(port, ui); 
     } 

     @Override 
     public void onReceive(String[] msg) 
     { 
      //updates messages textview 
     } 

     @Override 
     public void onNotify(String[] msg) 
     { 
      //updates notification textview 
     } 
    } 
} 

onReceive (문자열 [] MSG)를 호출하고 또한 다른 스레드에서 메시지를 수신하면 다음과 같습니다 처리하는 코드의 RemoteControlServer 구현,

... 

public abstract void onReceive(String[] msg); 
public abstract void onNotify(String[] msg); 

... 

controlListener = new Thread(new Runnable() 
{ 
    boolean running = true; 
    public void run() 
    { 
     String line = null; 
     while(running) 
     { 
      try 
      { 
       //Handle incoming messages 

       ... 

       onReceive(messages);  
      } 
      catch (final Exception e) 
      { 
       UIHandler.post(new Runnable() 
       { 
        public void run() 
        { 
         onNotify("Wifi Receive Failed " + e.toString() + "\n"); 
        } 
       }); 
      } 
     } 
    } 
}); 

... 

"뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 만질 수 있습니다."라는 오류가 나타납니다. onReceive()가 호출 될 때 예외를 던지고 onNotify()를 예외 설명과 함께 호출합니다. 왜 onNotify()는 작동하지만 다른 하나는 작동하지 않습니까? 어떻게하면 청취자를 TextView로 올바르게 호출하고 텍스트를 업데이트 할 수 있습니까? 감사합니다

답변

1
private class RemoteControlServer extends RemoteControl 
{ 

    ... 

    public class BridgeThread implements Runnable 
    { 
     String[] msgArray = null; 
     public BridgeThread(String[] msg) 
     { 
      msgArray = msg; 
     } 

     public void run() 
     { 
      runOnUiThread(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        TextView zValue = (TextView) findViewById(R.id.connectionStatus); 
        zValue.setText(msgArray[0]); 
       } 
      }); 
     } 
    } 

    @Override 
    public void onReceive(String[] msg) 
    { 
     BridgeThread bridgeTest = new BridgeThread(msg); 
     bridgeTest.run(); 
    } 

    ... 
} 
+0

이 코드는 현재 사용중인 새 Thread() 코드를 대체합니까? 내가 틀렸다면 정정하되,이 작업을 내 UI 스레드에서 내 ServerSocket을 실행하지 않을 것입니까? – anders

+0

TextView에 표시하려는 String을받을 때 ... 그냥 코드를 복사하고 setText를 textview에서 호출합니다. (위의 코드에서 // 텍스트를 설정합니다) ... 당신이 메시지를 받기 위해 구현 한 다른 스레드의 UI 스레드 (UI 스레드는 사용자 인터페이스에서 작동 할 수 있고 원하는 것)를 호출합니다. :) 나는 EN에 그다지 좋지 않다./ –

+1

제안에 대한 Matej에게 감사의 말을 전한다. 약간의 시도를 해 줄 것이다. – anders

관련 문제