안드로이드 사용자 질문/답변
(글 수 2,012)
안드로이드스튜디오를 통해 서버와 소켓통신이 가능한 앱을 구상인데
android.os.Networkonmainthreadexception에러 때문에 진행이 안됩니다ㅠㅠ
private String getResponse(String request) {
Intent intent = getIntent();
String ipAddress = intent.getStringExtra("IP");
int port = intent.getIntExtra("PORT", 0);
try {
Socket socket = new Socket(ipAddress, port)//SPECIAL_IP_TO_HOST_COMPUTER, PORT_NUMBER
OutputStream output = socket.getOutputStream();
output.write((request + "\n").getBytes());
output.flush();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = input.readLine();
socket.close();
return response;
} catch (IOException ex) {
Log.e("SHIT", ex.toString());
return ex.toString();
} catch (Exception ex) {
Log.e("SHIT", ex.toString());
return ex.toString();
}
}
소켓을 생성하고 데이터를 주고받는 이 부분을 Thread나 AsyncTask를 사용하면 해결된다는데 안드로이드 스튜디오 초보자라서 어떤식으로 수정해야할지 예제를 봐도 잘 모르겠내요;; 어떻게 고쳐야할지 알려주시면 정말 감사하겠습니다..
아래는 전체 소스코드입니다.
package com.example.bman.mousecontrollclientsimple; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; public class ButtonControlActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_button_control); Intent intent = getIntent(); String ipAddress = intent.getStringExtra("IP"); int port = intent.getIntExtra("PORT",0); if(ipAddress != null) { TextView IpPort = (TextView) findViewById(R.id.IpPort); IpPort.setText(ipAddress + " : " + port); } } public void buttonLeft(View view) { String request = "mouseMove 10 0"; Log.d("MINE", "request: " + request); RequestResponseTask task = new RequestResponseTask();// task.execute(request);// String response = getResponse(request); TextView error = (TextView) findViewById(R.id.error); error.setText(response); } public void buttonClick(View view) { String request = "mouse1Click"; Log.d("MINE", "request: " + request); RequestResponseTask task = new RequestResponseTask();// task.execute(request);// String response = getResponse(request); TextView error = (TextView) findViewById(R.id.error); error.setText(response); } private class RequestResponseTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... request) { Log.d("TASK", "request: " + request[0]); return getResponse(request[0]); } @Override protected void onPostExecute(String response) { Log.d("TASK", "response: " + response); TextView error = (TextView) findViewById(R.id.error); error.setText(response); } } private String getResponse(String request) { Intent intent = getIntent(); String ipAddress = intent.getStringExtra("IP"); int port = intent.getIntExtra("PORT", 0); try { Socket socket = new Socket(ipAddress, port);//SPECIAL_IP_TO_HOST_COMPUTER, PORT_NUMBER OutputStream output = socket.getOutputStream(); output.write((request + "\n").getBytes()); output.flush(); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); String response = input.readLine(); socket.close(); return response; } catch (IOException ex) { Log.e("SHIT", ex.toString()); return ex.toString(); } catch (Exception ex) { Log.e("SHIT", ex.toString()); return ex.toString(); } } }
https://lovemewithoutall.github.io/it/networkOnMainThreadException/
참고하세여