1

Android用のソケットプログラムのrun()スレッドメソッド内にいくつかのonclickメソッドを配置しました。

彼らはうまくいかないようです。これらのonclickリスナーをrun()メソッド内に配置することも可能になりました。ボタンをクリックしたときにボタンが応答を生成しない理由がわかりません。メッセージが送信されていません

これが私が使用している2つのonclickリスナーです。1つはsendAで、もう1つはsendBで、テキストメッセージtestAとtestBを送信します。

public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            Socket socket = new Socket(serverAddr, 8080);
            connected = true;
            while (connected) {
                try {
                    Log.d("ClientActivity", "C: Sending command.");
                    final PrintWriter out = new PrintWriter(
                        new BufferedWriter(new OutputStreamWriter(
                            socket.getOutputStream())), true);
                    sendA.setOnClickListener(new View.OnClickListener() {

                        // ananamous inner class override for on click
                        public void onClick(View v) {
                            out.println("testA");
                        }
                    });
                    sendB.setOnClickListener(new View.OnClickListener() {

                        // ananamous inner class override for on click
                        public void onClick(View v) {
                            out.println("testB");
                        }
                    });
                    // where you issue the commands
                    // out.println("testX");
                    Log.d("ClientActivity", "C: Sent.");
                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
            Log.d("ClientActivity", "C: Closed.");
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}
4

2 に答える 2

1

簡単なデモを作成しましたが、動作します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HelpActivity" >

<Button
    android:id="@+id/a"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="A" />
<Button
    android:id="@+id/b"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/a"
    android:text="B" />

</RelativeLayout>

public class HelpActivity extends Activity {

private Button aBtn;
private Button bBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_help);
    aBtn = (Button) findViewById(R.id.a);
    bBtn = (Button) findViewById(R.id.b);
    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            aBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Log.v("a", "a");
                }
            });
            bBtn.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {   
                    Log.v("b", "b");
                }
            });

        }
    }).start();
}

}

ボタンをクリックすると、LogCat にログが表示されます。 LogCat ビュー

したがって、状況はシーケンスによって引き起こされる可能性があります。ボタンをクリックしたときに、リスナーがボタンに接続されていないことを意味します。

メイン スレッドにリスナーを設定する必要がある場合は、handler を使用できます。 この Handler クラスは静的である必要があります。そうしないと、リークが発生する可能性があります。

于 2013-01-24T02:45:58.327 に答える
1

はい、できますが、実行可能なスレッド内のonclickリスナーが再び

それは私のためにこのように動作します

 public class sendLogs implements Runnable{ 
    @Override
    public void run() {


    //your other codes



    runOnUiThread(new Runnable() {
     @Override
     public void run() {
    //place your onclick listener method here...
    }
    }
于 2013-01-24T03:09:24.153 に答える