android onclick按钮在套接字上写入字符串
您好,我正在建立一个应用程序,需要用户按下按钮(共8个按钮)。这些按钮用于将字符串发送到服务器onclick。我遇到的问题是,当我连接到服务器后按下任何一个按钮时,它会按应有的方式发送字符串,但第二次什么也没发生。有人建议我使用AsyncTask中的doInBackground()来运行socket,并在每次按下按钮时对其进行写入。但我不能这样做。我该怎么办?我不知道问题出在哪里。我把代码放在这里 这是我的活动android onclick按钮在套接字上写入字符串,android,sockets,onclick,android-asynctask,Android,Sockets,Onclick,Android Asynctask,您好,我正在建立一个应用程序,需要用户按下按钮(共8个按钮)。这些按钮用于将字符串发送到服务器onclick。我遇到的问题是,当我连接到服务器后按下任何一个按钮时,它会按应有的方式发送字符串,但第二次什么也没发生。有人建议我使用AsyncTask中的doInBackground()来运行socket,并在每次按下按钮时对其进行写入。但我不能这样做。我该怎么办?我不知道问题出在哪里。我把代码放在这里 这是我的活动 public class Acontroller extends Activity
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类中定义的。现在我想问,当用户按住按钮任意特定时间时,是否会根据按钮按下的持续时间增加一个变量?这样我就可以循环使用它了?或者有没有一种方法可以让我获得按下并保持按钮的延迟或持续时间?