Привет, я создаю приложение, которое требует, чтобы пользователь нажимал кнопки (всего 8 кнопок). Эти кнопки используются для отправки строк на сервер onclick. Проблема здесь, когда я нахожусь, когда я нажимаю любую кнопку после подключения к серверу, она отправляет строку как следует, но во второй раз ничего не происходит. Мне предложили использовать doInBackground() из AsyncTask, чтобы запустить работу сокета и записывать его каждый раз при нажатии кнопок. Но я не могу этого сделать. Что мне делать? Я не знаю, где проблема. Здесь я помещаю свой код.
Это моя деятельность
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;
}
Моя цель - столько раз, когда пользователь нажимает кнопки, соответствующие строки должны быть отправлены на сервер. Вот мой код сервера. Я использую ПК в качестве сервера.
public class Server
public static void main(String[] args) throws AWTException {
String msg_received = null;
String fw = "forward";
String bw = "backward";
String l = "left";
String r = "right";
String se = "select";
String st = "start";
String a = "a";
String b = "b";
String fin = "finish";
// Boolean finish = (msg_received.equal(fin));
Robot robot = new Robot();
try {
ServerSocket ss = new ServerSocket(2222);
System.out.println("Server Started...");
while (true) {
Socket s = ss.accept();
System.out.println("Connection Request Received");
DataInputStream DIS = new DataInputStream(s.getInputStream());
msg_received = DIS.readUTF();
System.out.println(msg_received);
// s.close();
// ss.close();
if (msg_received.equals(fw)) {
// tu yeh kerna
robot.keyPress(KeyEvent.VK_UP);
robot.keyRelease(KeyEvent.VK_UP);
}
Пожалуйста, помогите мне, это действительно важно для меня. Заранее спасибо.
Вы не можете повторно использовать AsyncTask. Вам нужно создать новый объект и вызвать execute.
замещать
start.execute();
с
start = new MyThread(); start.execute (ф);
или если вы можете уйти с удалением экземпляра, когда это будет сделано, вы можете просто сделать это:
(новый MyThread()). start();
РЕДАКТИРОВАТЬ:
Чтобы отправить параметры AsyncTask, выполните следующие действия:
start.execute(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 единиц.
onPause()
. ОДНАКО, скорее всего, лучше всего открыть его вdoInBackground
и закрыть вonPostExecute()
AsyncTask. Сделайте всю очистку в этом методе. Строка может быть отправлена в качестве параметра при вызовеexecute()
. Если вы извлекаете его, то вам нужно либо сохранить ссылку на AsyncTask, пока вы не соберете ее, либо сохранить ее где-нибудь.