Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android onclick按钮在套接字上写入字符串_Android_Sockets_Onclick_Android Asynctask - Fatal编程技术网

android onclick按钮在套接字上写入字符串

android onclick按钮在套接字上写入字符串,android,sockets,onclick,android-asynctask,Android,Sockets,Onclick,Android Asynctask,您好,我正在建立一个应用程序,需要用户按下按钮(共8个按钮)。这些按钮用于将字符串发送到服务器onclick。我遇到的问题是,当我连接到服务器后按下任何一个按钮时,它会按应有的方式发送字符串,但第二次什么也没发生。有人建议我使用AsyncTask中的doInBackground()来运行socket,并在每次按下按钮时对其进行写入。但我不能这样做。我该怎么办?我不知道问题出在哪里。我把代码放在这里 这是我的活动 public class Acontroller extends Activity

您好,我正在建立一个应用程序,需要用户按下按钮(共8个按钮)。这些按钮用于将字符串发送到服务器onclick。我遇到的问题是,当我连接到服务器后按下任何一个按钮时,它会按应有的方式发送字符串,但第二次什么也没发生。有人建议我使用AsyncTask中的doInBackground()来运行socket,并在每次按下按钮时对其进行写入。但我不能这样做。我该怎么办?我不知道问题出在哪里。我把代码放在这里

这是我的活动

public class Acontroller extends Activity {

Button bForward;
Button bBackward;
Button bRight;
Button bLeft;
Button bSelect;
Button bStart;
Button bB;
Button bA;
Socket s;
DataOutputStream os;
String ip;

// MyAppActivity ip = new MyAppActivity();
MyThread start = new MyThread();

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.nesskin);

    bForward = (Button) findViewById(R.id.bForward);
    bBackward = (Button) findViewById(R.id.bBackward);
    bRight = (Button) findViewById(R.id.bRight);
    bLeft = (Button) findViewById(R.id.bLeft);
    bSelect = (Button) findViewById(R.id.bSelect);
    bStart = (Button) findViewById(R.id.bStart);
    bA = (Button) findViewById(R.id.bA);
    bB = (Button) findViewById(R.id.bB);

    Bundle gotIP = getIntent().getExtras();
    ip = gotIP.getString("ipAddress");


//  start.doInBackground(ip);
    //start.execute(ip);
    // sock.start();

}

protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();

    bForward.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            start.execute(ip);
        }
    });
和从线程

public class MyThread extends AsyncTask <String, Void, String>{


Socket s;
DataOutputStream os;
String ip;
String cmd;


  @Override
  protected void onPreExecute() {
      Log.i("AsyncTask", "onPreExecute");
  }



@Override
protected String doInBackground(String... params) {
    int port = 2222;


    // TODO Auto-generated method stub

    if(s.isConnected()){
        try {
            os.writeUTF("forward");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }else{



    try {
    s= new Socket(ip, port);
    os = new DataOutputStream(s.getOutputStream());
    os.writeUTF("forward");

    }catch(Exception e){

        e.printStackTrace();
    }


    finally{
          if (s!= null){
           try {
            s.close();
           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           }
          }

          if (os != null){
           try {
            os.close();
           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
           }
          }
    }


}


    return null;
}

请帮助我,这对我来说真的很重要。提前感谢。

您不能重复使用异步任务。您必须创建一个新对象并调用execute

替换

start.execute()

start=newmythread(); 启动、执行(ip)

或者,如果可以在实例完成后删除该实例,则可以执行以下操作:

(新的MyThread()).start()

编辑:

要将参数发送到AsyncTask,请执行以下操作:

执行(ip、cmd、param3、param4、param5)

doInBackground
中收集如下参数:

protected Void doInBackground(String... params)
{
   String ipParam = params[0];
   String cmdParam = params[1];
   String thirdParam = params[2];
   String fourthParam = params[3];
   String fifthParam = params[4];
}

您可以将任意多个字符串传递到
params
中,它将在运行时自动创建一个包含所有参数的新数组。请注意,如果只传入两个,那么
params
大小将仅为两个。如果传入100个参数,则
参数的大小将为100个单位。

不能重复使用异步任务。您必须创建一个新对象并调用execute

替换

start.execute()

start=newmythread(); 启动、执行(ip)

或者,如果可以在实例完成后删除该实例,则可以执行以下操作:

(新的MyThread()).start()

编辑:

要将参数发送到AsyncTask,请执行以下操作:

执行(ip、cmd、param3、param4、param5)

doInBackground
中收集如下参数:

protected Void doInBackground(String... params)
{
   String ipParam = params[0];
   String cmdParam = params[1];
   String thirdParam = params[2];
   String fourthParam = params[3];
   String fifthParam = params[4];
}

您可以将任意多个字符串传递到
params
中,它将在运行时自动创建一个包含所有参数的新数组。请注意,如果只传入两个,那么
params
大小将仅为两个。如果传入100个参数,则
params
的大小将为100个单位。

myThread类中的代码是否正常?我如何传递要发送到套接字的字符串?通过使用just start.execute()?我想在套接字上写多少次,然后在退出应用程序时关闭,这是什么方法?哦,我明白了。在异步任务中保持套接字打开。如果您需要在应用程序的整个生命周期中打开它,则需要将其移出并在
onPause()
中关闭。但是,最好在AsyncTask的
doInBackground
中打开它,然后在
onPostExecute()
方法中关闭它。用该方法进行所有清理。调用
execute()
时,可以将字符串作为参数发送。如果您要检索它,那么您需要保留对AsyncTask的引用,直到您收集它为止,或者将它存储在某个地方。我不能评论套接字代码的正确性,因为我个人在我的应用程序中没有做过太多的网络编码,而且我现在也没有这些代码。您的问题是
AsyncTask
只运行了一次,我知道这就是原因。在执行时,我想发送字符串ip和字符串cmd。cmd是在activity类中定义的。现在我想问,当用户按住按钮任意特定时间时,是否会根据按钮按下的持续时间增加一个变量?这样我就可以循环使用它了?或者有没有一种方法可以让我获得按下并保持按钮的延迟或持续时间?myThread类中的代码很好?我如何传递要发送到套接字的字符串?通过使用just start.execute()?我想在套接字上写多少次,然后在退出应用程序时关闭,这是什么方法?哦,我明白了。在异步任务中保持套接字打开。如果您需要在应用程序的整个生命周期中打开它,则需要将其移出并在
onPause()
中关闭。但是,最好在AsyncTask的
doInBackground
中打开它,然后在
onPostExecute()
方法中关闭它。用该方法进行所有清理。调用
execute()
时,可以将字符串作为参数发送。如果您要检索它,那么您需要保留对AsyncTask的引用,直到您收集它为止,或者将它存储在某个地方。我不能评论套接字代码的正确性,因为我个人在我的应用程序中没有做过太多的网络编码,而且我现在也没有这些代码。您的问题是
AsyncTask
只运行了一次,我知道这就是原因。在执行时,我想发送字符串ip和字符串cmd。cmd是在activity类中定义的。现在我想问,当用户按住按钮任意特定时间时,是否会根据按钮按下的持续时间增加一个变量?这样我就可以循环使用它了?或者有没有一种方法可以让我获得按下并保持按钮的延迟或持续时间?