タイトルの通りですが、Android上でTCPクライアントを作ろうとしてエラーが出て詰まったので記録。
new Socket(“(ip address), (port)”); にてソケットを作ろうとすると強制終了。
エラーログには「android.os.NetworkOnMainThreadException」という文字が。
どうやら、Android3.0以降ではメインスレッド(UIスレッド)でネットワーク処理を行うとこのエラーになるようです。
AsyncTaskクラスを継承したクラスを作成することにより解決。(AsyncTaskLoaderを利用する方法もあるようです)
TCPTask.java
public class TCPTask extends AsyncTask<Integer, Integer, Integer> { @Override protected Bitmap doInBackground(Integer... params) { try { Socket sock = new Socket("(ip address), (port)"); // 接続開始 } catch (IOException e) { e.printStackTrace(); } return null; } }
これを、メインスレッドで呼び出せばおk。
MainActivity.javaの一部
TCPTask tcpTask = new TCPTask(); tcpTask.execute();
ソケット終了処理等を省いています。