1

サービスを使用して、ソケットでサーバーに接続しようとしています。しかし、何らかの理由で接続できず、この行で NetworkOnMainThreadException を返します。

socket = new Socket(SERVER_IP, SERVERPORT);

マニフェストに Permission とサービスを既に追加しています。

public class SocketService extends Service{

    // Binder given to clients
    private final IBinder mBinder = new LocalBinder();
    private Socket socket = null;
    private DataInputStream in;
    private DataOutputStream out;



    /**
     * Class used for the client Binder.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with IPC.
     */
    public class LocalBinder extends Binder {
        SocketService getService() {
            // Return this instance of LocalService so clients can call public methods
            return SocketService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return mBinder;
    }

     /** method for clients */
    public Socket getSocket() {
        return socket;
    }

    public InputStream getDataInputStream() throws IOException {
        return socket.getInputStream();
    }

    public OutputStream getDataOutputStream() throws IOException {
        return socket.getOutputStream();
    }

    @Override
    public void onCreate(){
        String SERVER_IP = "10.0.2.2";
        int SERVERPORT = 8080;
        try {
            socket = new Socket(SERVER_IP, SERVERPORT);
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
        } catch (Exception ex) {
            Log.e("Erreur","Connexion impossible !");
            ex.printStackTrace();
        }
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String sendMessage(String message) {     
        String response = "";
        try {
            out.writeBytes(message + "\n");
            out.flush();
            response = this.in.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return response;
    }
}

バインドされたサービスを使用してそれを行うのは良い方法ですか? 私はこのサービスを多くのアクティビティで使用したいと考えており、Android のドキュメントでは、Bound サービスを使用するとよいと書かれています。

ご協力いただきありがとうございます !

4

2 に答える 2

0

他のスレッドで接続が行われる場所にコードを配置する必要があります(asyncTaskを使用してみてください)

ドキュメントを読む http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

于 2014-05-26T16:24:28.893 に答える
0

ネットワーク要求が特定のアクティビティに関連付けられていない場合は、 Service でネットワーク処理を行うことをお勧めします。ただし、Service が同じプロセスで実行されているか別のプロセスで実行されているかに関係なく、そのライフサイクル メソッドは引き続き「メイン」スレッドで呼び出されます。AsyncTasks を直接使用する手間を省き、android-async-http のようなカプセル化されたライブラリを使用します。

于 2014-05-26T16:47:12.530 に答える