2

シンプルなアプリを作ろうとしています。ユーザーが1つの編集テキストを見ると、その中にテキストを入力し、送信を押します...ラップトップ上のサーバーはそのメッセージを受信します。

今、NetworkOnMainThread例外は私に頭痛を与えています......その時NetworkOnMainThread例外のようなものがなかったので、アプリは2.3.3のために完全に動作します。

たくさん検索した..2つの解決策は

  1. ネットワーキング用の新しいスレッドを作成するまたは
  2. AsyncTask。

結果なしで両方を試しました。

試してみてください1:別のスレッドで:

今私が理解できたのは、別のスレッドを開始する必要があるということです。Ok。やった。

以下は私のクライアント側のコードです。

EditText e ;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    e= (EditText) findViewById(R.id.editText1);
    tv = (TextView) findViewById(R.id.textView1);
    Thread startNetworking = new Thread(new NetworkThread());
    startNetworking.start();
}

public void sendMessage(View v){
        if(NetworkThread.sendToClient(e.getText().toString()))
            tv.setText("Status : Successful");
        else
            tv.setText("Status : Unsuccessful");
}

sendMessageは、送信ボタンのonClick関数です。別のJAVAファイルNetworkThread.java...があります。

そのためのコードは次のとおりです。

public class NetworkThread implements Runnable{

static DatagramSocket socket;
static InetAddress add;
public void run() {
    try {
        socket = new DatagramSocket();
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        add = InetAddress.getByName("192.168.1.12");
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public static boolean sendToClient(String message){
    DatagramPacket p = new DatagramPacket(message.getBytes(),message.getBytes().length,add,4444);
    try {
        socket.send(p);
        return true;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
}
}

これはまだ機能しません。私は最初にこの最初の試みを使い果たしたいと思います、それから私はここでAsyncTaskと私が試したことについて尋ねることに移ります。ですから、とりあえず、文字列を送受信するというこの単純なタスクを達成するのを手伝ってください。

4

1 に答える 1

2

残念ながら、sendToClient()と同じクラスで定義したからとNetworkThreadいって、それがネットワーク固有のスレッドで実行されるわけではありません。メソッドはsendToClient()メソッドから呼び出されているため、メイン (UI) スレッドで引き続き実行されますonClick()。などの UI コールバックは、onClick()常に UI スレッドで処理されます。

実行前に任意のデータ (パラメータなど) をバックグラウンド/ネットワーク スレッドにAsyncTask送信できるため、 を使用することをお勧めします。message使い続けるとRunnableThreadUI とネットワーク スレッドの実行を同期するための追加の機械が必要になります。これらの課題は によって舞台裏で処理されAsyncTaskます。

于 2012-10-13T14:14:37.503 に答える