【问题标题】:Running a Runnable Thead multiple times (Android)多次运行 Runnable Thead (Android)
【发布时间】:2014-04-25 12:04:42
【问题描述】:

我之前发布了一个问题,您帮助我解决了我的项目并大大提高了我的项目,并且正在寻找最后一点帮助。

我的笔记本电脑上运行着一个 Java TCP 服务器,它只是不断地读取通过该 TCP 端口提供的行。我 100% 肯定该功能正在运行,我在没有 android 应用程序的情况下对其进行了测试。

我的问题在于这段代码的某个地方:

public class MainActivity extends Activity {

private String serverIpAddress = "10.30.13.110";
private int serverPort = 50505;
private boolean connected = false;
private char launchercontrolcode;
Button button1;
ImageButton button2, button3, button4, button5, button6;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button1 = (Button)findViewById(R.id.armbutton);
    button1.setOnClickListener(onClickListener);
    button2 = (ImageButton)findViewById(R.id.firebutton);
    button2.setOnClickListener(onClickListener);
    button3 = (ImageButton)findViewById(R.id.upbutton);
    button3.setOnClickListener(onClickListener);
    button4 = (ImageButton)findViewById(R.id.downbutton);
    button4.setOnClickListener(onClickListener);
    button5 = (ImageButton)findViewById(R.id.leftbutton);
    button5.setOnClickListener(onClickListener);
    button6 = (ImageButton)findViewById(R.id.rightbutton);
    button6.setOnClickListener(onClickListener);
}


private OnClickListener onClickListener = new OnClickListener() {
    @Override
    public void onClick(final View v) {
        switch(v.getId()){
            case R.id.armbutton:
                if (!connected) {
                    launchercontrolcode = 'A';
                    Thread cThread = new Thread(new ClientThread());
                    cThread.start();
                    for(int i =0 ; i<10; i++);
                }
            break;
            case R.id.firebutton:
                if (!connected) {
                    launchercontrolcode = 'F';
                    Thread cThread = new Thread(new ClientThread());
                    cThread.start();
                }
            break;
            case R.id.upbutton:
                if (!connected) {
                    launchercontrolcode = 'U';
                    Thread cThread = new Thread(new ClientThread());
                    cThread.start();
                }
            break;
            case R.id.downbutton:
                if (!connected) {
                    launchercontrolcode = 'D';
                    Thread cThread = new Thread(new ClientThread());
                    cThread.start();
                }
            break;
            case R.id.leftbutton:
                if (!connected) {
                    launchercontrolcode = 'L';
                    Thread cThread = new Thread(new ClientThread());
                    cThread.start();
                }
            break;
            case R.id.rightbutton:
                if (!connected) {
                    launchercontrolcode = 'R';
                    Thread cThread = new Thread(new ClientThread());
                    cThread.start();
                }
            break;
        }
    }
};

public class ClientThread implements Runnable {
    public void run() {
            try {
                Socket socket = new Socket(serverIpAddress, serverPort);
                connected = true;
                Log.d("ClientActivity", "Client Connected");
                    try {
                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                        out.println(launchercontrolcode);
                        Log.d("ClientActivity", "Cliend Sent Code");
                        out.flush();
                        out.close();
                    } catch (Exception e) {}
                    socket.close();
                    Log.d("ClientActivity", "Post-socket close");
                } catch (Exception e) {     
            connected = false; 

        }
    }
}
}

我的问题是,如果我按下第一个按钮,它会很好地发送到服务器;但是,当我按第二次(或 X)时间时,由于某种原因它不会发送到服务器。我相当有信心问题出在我的 switch 语句中,但不确定它到底是什么。

提前致谢:)

【问题讨论】:

  • 当你再次按下第一个按钮时会发生什么?
  • 还是什么都没有,只是第一次按下按钮有效,注册后什么都没有

标签: java android tcp tcpclient


【解决方案1】:

问题是一旦你进入那个线程..布尔连接设置为真,但是当你完成并关闭所有连接时它仍然是真的..

为什么?因为它在 catch 里面,所以它不应该在那里..如果你想再次点击另一个按钮..你正在等待再次点击异常..

解决方案:

public class ClientThread implements Runnable {
    public void run() {
            try {
                Socket socket = new Socket(serverIpAddress, serverPort);
                connected = true;
                Log.d("ClientActivity", "Client Connected");
                    try {
                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                        out.println(launchercontrolcode);
                        Log.d("ClientActivity", "Cliend Sent Code");
                        out.flush();
                        out.close();
                    } catch (Exception e) {}
                    socket.close();
                    Log.d("ClientActivity", "Post-socket close");
                } catch (Exception e) {      

        }finally{
          connected = false;
      }

    }
}
}

【讨论】:

  • 很好,我错过了父类中的变量声明,并认为这是一个错字。
  • @jgitter 是的,我刚刚注意到 connected 在 catch 中,一旦它捕获到错误,它就永远不会再次为假
  • 成功了,谢谢!另外,我知道 Wifi 可能不会是发送代码的最快方法,但您有什么建议可以缩短发送代码的时间吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多