Как добавить больше методов в класс AsyncTask? - PullRequest
1 голос
/ 14 мая 2019

Я хочу установить соединение между моим android и сервером (на моем ПК) через сокеты Java. Просто он просто отправляет данные, такие как строка и целое число, по локальной сети.

Я читал о классе AsyncTask. Я добавил свой код подключения к сокету в методе doInBackground() в классе (класс с именем RemoteClient). Вот код для подключения и инициализации подключения через сокет:

    @Override
    protected Void doInBackground(Void... arg0) {
        Log.i("Socket","Connecting to the remote server: " + host);
        try{
            socket = new Socket(host,8025);
            oos = new ObjectOutputStream(socket.getOutputStream());

        }catch(IOException ex){
            ex.printStackTrace();
        }
        return null;

    }

Просто я просто хочу сделать метод sendInteger(int value) на сервер через сокет. Я уже закончил соединение, оно подключается хорошо.

Итак, куда я должен поместить метод sendInteger(int value), можно ли просто поместить метод в класс RemoteClient вместе с реализованными методами?

Я хочу вызывать методы sendInteger(int value) при нажатии кнопки.

Спасибо ..

1 Ответ

2 голосов
/ 14 мая 2019

Да, вы можете просто поместить sendInteger в вашу AsyncTask. Мне нравится использовать конструктор вместо параметров AsyncTask, потому что он более гибкий. Вы можете реализовать интерфейс в качестве обратного вызова для получения ответа сервера внутри вашего пользовательского интерфейса. onPostExecute всегда будет вызываться системой сразу после выполнения onBackground. onPostExecute запускается также в потоке пользовательского интерфейса, поэтому вам не нужно возвращаться в свой поток пользовательского интерфейса, поскольку AsyncTask будет работать в другом потоке.

Ваш код будет выглядеть так:

Fragmentclass or Activity:

private void onButtonClick() {
  ...
  RemoteClient rc = new RemoteClient(value, (response) -> {
     Log.d(response);
  };
  rc.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  ...
}

public class RemoteClient extends AsyncTask<Void, Void, Void> {
  private Callback callback;
  private int intValue;

  public RemoteClient(int intValue, Callback callback) {
    this.callback = callback;
    this.intValue = intValue;
  }

  @Override
  protected Void doInBackground(Void... arg0) {
      Log.i("Socket","Connecting to the remote server: " + host);
      try{
        socket = new Socket(host,8025);
        oos = new ObjectOutputStream(socket.getOutputStream());
        sendInteger(intvalue);
      } catch(IOException ex){
        ex.printStackTrace();
      }
      return null;

  }

  private void sendInteger(int value) {
    // send the integer
  }

  protected void onPostExecute(Void aVoid) { 
    if (callback != null) {
       callback.response;
    }
  }

private interface Callback {
  void serverResponse(String value);
}
}

Если вы хотите быть более гибким, вы можете реализовать класс NetworkManager, который просто запускает вашу асинхронную задачу. Затем вы всегда можете передать String как JSON в AsyncTask. Или вы просто используете AsyncTask, но тогда я бы рекомендовал использовать наследование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...