마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

스레드&리스너 관련 질문입니다.

0 추천
스레드 사용하여

소켓통신 연결/종료/수신이 인터페이스 이벤트로

발생하는 클래스를 구현하였습니다.

이 해당 동작을 액티비티에서 연결/종료/수신 인터페이스를

implement 이후, 소켓통신 클래스에서 리스너를 set한후에

디버그를 통하여 연결/종료/수신 리스너가 정상적으로 동작하는 것을

확인하였습니다.

이후는 이 다음부터인데요.

리스너의 메소드에서 ui를 사용할 때 익셉션이 발생합니다.

onylt the original thread... 주저리주저리~

메인 스레드가 아닌 다른 스레드에서 ui 처리를 사용하였다고

하는 문제같은데 파악학에는..

물론 runonuithread를 사용하면 되는 건 압니다.

그런데 그렇다고 매변 연결/종료/수신때마다 runonuithread를

쓰자니 참....위젯을 한개 이상 사용하려고 할때는 막막하더군요

어떤방식으로 처리하면 좋을까요 답변부탁드립니다..ㅠㅠ

 

다음은 소수 일부분 첨부입니다.

-----------------------------------------

class ABCD extend Activity implement IClientListener

{
onCreate

{

Client client = new Client();

client.setListener(this);

client.start();

}

 

// 인터페이스 메소드

// 해당 메소드 안에서 ui 처리시 exception 발생

// 메소드마다 runonuithread를 사용하지 않고 처리하는 방법??

onConnected

{

}

 

onDisconnected

{

}

 

onReceived

{
}

 

}
꿈꾸는쭌 (1,130 포인트) 님이 2015년 4월 15일 질문

2개의 답변

0 추천
 
채택된 답변
이벤트 발행하는 클래스에서

Handler handler = new Handler(Looper.getMainLooper());

handler.post(new Runnable() {

    @Override

    public void run() {

        dispatchEvent();

    }

});

 

식으로 하는건 어떨까요
mamondebaltob (32,750 포인트) 님이 2015년 4월 15일 답변
꿈꾸는쭌님이 2015년 4월 20일 채택됨
0 추천
안드로이드에서는 기본적으로 (다른 곳에서도 비슷한게 많습니다만...) UI쓰레드에서만 UI처리가 가능한 걸로 알고 있습니다.

해당 오류를 해결 하시려면 UI 작업은 Handler를 통해서 작업을 하셔야 할 것 같습니다.

Handler를 사용하시기 싫으시면 만약 수신 받은 내용을 TextView에 표출 하셔야 한다면

TextView.post(new Runnable() {

    TextView.setText(수신받은 내용);

});

이런 방법도 가능 할 것 같습니다.

 

위의 방법도 싫으시다면 UI를 업데이트 시킬 액티비티에서 인터페이스를 구현 하여 해당 인터페이스를 쓰레드로 전달하여

쓰레드에서 ui를 업데이트 시킬때 해당 인터페이스를 호출 하는 방법도 있을것 같습니다.
익명사용자 님이 2015년 4월 15일 답변
...