0

Androidプラットフォームでソケットプログラミングがどのように機能するかを簡単に説明するために、スレッド/ asyntaskを使用せず、(可能であれば)例外をキャッチせずに単純なソケットプログラムを開発したいと思います。それは可能ですか?私は試しましたが、機能しません(他の多くの人が指摘しているように、ソケットは他のスレッドで実行する方が良いです)。

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView) findViewById(R.id.TextView01);
    tv.setText("Nothing from client yet");

 }


 public Void handleOnClick(View v) {
     Socket s = null;
     try {
     ss = new ServerSocket(SERVERPORT);
     } catch (IOException e) {
     e.printStackTrace();
     }
     try {
     s = ss.accept();
     BufferedReader input = new BufferedReader(
         new InputStreamReader(s.getInputStream()));
     String st = null;
     st = input.readLine();
     mClientMsg = st;
     } catch (IOException e) {
     e.printStackTrace();
     }
 }
4

1 に答える 1

0

AsyncTask を使用せずに何でも開発できますが、タスクが完了するまでアプリケーションがブロックされるため、絶対にお勧めしません (既にご存じのとおりです)。この場合、OS がプロセスを強制終了しないように、ソケットは十分に速く応答する必要があります (ここで ANRに関する議論を参照してください)。

いずれかの時点で例外を処理する必要があります。あなたができる最善の方法は、メソッドが例外をスローし、メソッドが呼び出されるたびにそれらを処理することですが、これは例外を処理する必要がないという意味ではありません。これは彼らを遅らせるだけです。

public Void handleOnClick(View v) throws IOException {
    Socket s = null;
    ss = new ServerSocket(SERVERPORT);
    s = ss.accept();
    BufferedReader input = new BufferedReader(
            new InputStreamReader(s.getInputStream()));
    String st = null;
    st = input.readLine();
    mClientMsg = st;
}

これが他の人のための例またはデモンストレーションを意図している場合は、人々が物事を正しく行うことを学べるように適切に構成されている必要があります。例外を処理する必要がある場所で例外を処理することを検討することを強くお勧めします (または、より意味のある例外をチェーンにスローします)。さらに、これらのことをクラスまたは個人に教えている場合は、ANR で平手打ちを避ける方法をある時点で示す必要があります。

于 2012-08-02T03:21:01.343 に答える