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

NetworkOnMainThreadException에러좀 도와주세요 ㅠㅠ

0 추천

안드로이드를 클라이언트로하는 소켓연결 앱을 구상중인대 NetworkOnMainThreadException때문에 진행이 안되고 있습니다..

찾아보니까 메인스레드에서 네트워크작업을 수행할 수 없으니 별도에 스레드로 돌리던가 Asynctask를 사용하라고 하는데 제가 너무 초보인지라 예제를 보고 따라해도 에러가 뜨네요..

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);//
        // doInBackground//
        String response = getResponse(request);
        // onPostExecute//
        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();
        }
    }
}

이게 전체코드이고 

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();
    }
}

이부분이 네트워크 작업을 수행하는 부분입니다..

다른스레드로 돌리거나 Asynctask를 제가 예제보면서 따라해도 계속 에러가 발생하던데 에러가 안뜨도록 고쳐주실 수 있으면 정말 감사하겠습니다ㅠㅠㅠ

yucha123 (160 포인트) 님이 2019년 4월 15일 질문

2개의 답변

0 추천

적으신 글로 생각해보면

화면에서 버튼을 클릭하면 buttonLeft를 호출할때 오류가 발생하셨을듯하고요

아랫 부분을 제거하시면 될듯합니다.

설명 : https://itmir.tistory.com/624

 // doInBackground//
        String response = getResponse(request);
        // onPostExecute//
        TextView error = (TextView) findViewById(R.id.error);
        error.setText(response);
익명사용자 님이 2019년 4월 15일 답변
buttonLeft에서  Android AsyncTask호출하고
getResponse를 호출하면  NetworkOnMainThreadException를 다시 발생시킵니다.
0 추천
getResponse() 를 async 에서도 호출하고 그다음에 또 호출하는데 그 이유가 무엇인가요. 
산적 (1,360 포인트) 님이 2019년 4월 15일 답변
...