кнопки на android для записи строк в Socket

1

Привет, я создаю приложение, которое требует, чтобы пользователь нажимал кнопки (всего 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);

            }

Пожалуйста, помогите мне, это действительно важно для меня. Заранее спасибо.

Теги:
sockets
android-asynctask
onclick

1 ответ

1
Лучший ответ

Вы не можете повторно использовать 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 единиц.

  • 0
    код в классе myThread в порядке? и как мне передать мою строку, которая должна быть отправлена в сокет? используя просто start.execute ()? Как записать в сокет столько раз, сколько я хочу, а затем закрыть, когда я хочу выйти из приложения?
  • 0
    А ну понятно. Вы держите сокет открытым в своей AsyncTask. Если вам нужно, чтобы он открывался на протяжении всей жизни приложения, то вам нужно переместить его и закрыть в onPause() . ОДНАКО, скорее всего, лучше всего открыть его в doInBackground и закрыть в onPostExecute() AsyncTask. Сделайте всю очистку в этом методе. Строка может быть отправлена в качестве параметра при вызове execute() . Если вы извлекаете его, то вам нужно либо сохранить ссылку на AsyncTask, пока вы не соберете ее, либо сохранить ее где-нибудь.
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню