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

android.os.Networkonmainthreadexception에러.. 제발도와주세요 ㅜㅜ

0 추천

안드로이드스튜디오를 통해 서버와 소켓통신이 가능한 앱을 구상인데

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();
            }
    }
}
yucha123 (160 포인트) 님이 2019년 4월 4일 질문

1개의 답변

0 추천
안드로이드 정책으로 메인 스레드에서 네트웍 IO등을 할 수 없도록 제한합니다.

몇 가지 방법이 있지만, 간단하게 getResponse() 메서드를 AsynTask로 구현하시면 쉽게 해결하실 수 있습니다.
mcsong (44,040 포인트) 님이 2019년 4월 5일 답변
...