웹소켓 통신을 하고있습니다.
https://github.com/pavelbucek/tyrus-client-android-test/blob/master/src/main/java/com/example/AndroidClientTest/MyActivity.java
위 소스를 사용하여 만들었습니다.
public class MainActivity extends BaseActivity {
ThreadTest mThreadTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mThreadTest = new ThreadTest(getApplicationContext());
}
....
public void click(View v) {
switch (v.getId()) {
case R.id.btn1:
mThreadTest.socketConnect();
break;
case R.id.btn2:
new Thread(new Runnable() {
@Override
public void run() {
mThreadTest.sendMessage("hihi~~~");
}
}).start();
break;
case R.id.btn3:
new Thread(new Runnable() {
@Override
public void run() {
mThreadTest.wsClose();
}
}).start();
break;
}
}
public class ThreadTest {
private Session session_ = null;
private Context mContext;
public ThreadTest(Context context){
this.mContext = context;
}
synchronized public void socketConnect() {
final AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
try {
final ClientManager client = ClientManager.createClient();
Log.i(TAG, "### 1 AsyncTask.doInBackground");
client.connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig EndpointConfig) {
session_ = session;
try {
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
Log.i(TAG, "### 3 Tyrus Client onMessage: " + message);
}
});
Log.i(TAG, "### 2 Tyrus Client onOpen");
// session.getBasicRemote().sendText("Do or do not, there is no try.");
} catch (Exception e) {
// do nothing
}
}
@Override
public void onClose(Session session, CloseReason closeReason) {
super.onClose(session, closeReason);
Log.i(TAG, "onClose :: session = "+(session == null ? "false":"true"));
}
}, ClientEndpointConfig.Builder.create().build(), URI.create("ws://echo.websocket.org"));
} catch (DeploymentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
};
asyncTask.execute();
}
synchronized public boolean isConnected(){
return session_ == null ? false : true;
}
public void sendMessage(String a) {
if(isConnected()) {
try {
session_.getBasicRemote().sendText(a);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void wsClose(){
if(isConnected()) {
try {
session_.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
서버로 메시지를 날릴때와 종료할때 android.os.NetworkOnMainThreadException 에러가 나서
new Thread(...) 로 처리를 해줬습니다.
궁금한 점은
1. 메시지를 보낼때마다 혹은 소켓 종료시에 저렇게 단일Thread (new Thread.. )로 계속 띄워도 되는건가요?
2. 소켓 종료시 mThreadTest.wsClose(); 처리만 하고 onDestory 나 소스상에서 별다른 조치를 안해줘도 되는건가요??
더 나은방법이 있을거 같아서 문의드립니다. ㅠ