Android: подключение сервисов и сокетов

Я разрабатываю приложение для Android (я новичок) и пытаюсь открыть сокет и проверить статус подключения при запуске приложения.

Для этого у меня есть MainActivity, который запускается и привязывается к службе. В методе onBind () этой службы я вызываю функцию openSocket (), которая пытается открыть сокет с заданным IP-адресом и портом. Чтобы установить это соединение, я использую AsyncTask, где я пытаюсь перехватить исключения при открытии сокета в doInBackground (), и я обновляю логическое значение в соответствии со статусом соединения в onPostExecute ().

В MainActivity я хочу получить это логическое значение (Service.getConnectionStatus ()).

Проблема в том, что Service.getConnectionStatus () вызывается в MainActivity перед onPostExecute (), в результате чего логическое значение обновляется некорректно.

Я занимаюсь исследованием уже несколько дней, пробуя много разных вещей, и теперь я совершенно запутался ... Кто-нибудь знает, как дождаться завершения onPostExecute (), прежде чем вызывать getConnectionStatus в MainActivity?

Я пытался установить Listener для AsyncTask, но результат тот же. Я также пытался вызвать openSocket () из разных методов, но безуспешно ...

Спасибо за помощь.

MyService.java

public class MyService extends Service {

    private final IBinder mIBinder = new LocalBinder();
    private Socket mSocket;
    private String mDstAddress = "192.168.0.222";
    private int mDstPort = 23;
    private Boolean mConnectionStatus = false;

    public class LocalBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        openSocket(mDstAddress, mDstPort);
        return mIBinder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }

    public int getConnectionStatus() {
        if (mConnectionStatus) {
            return 1;
        } else {
            return 0;
        }
    }

    public void closeSocket() {
        if (mSocket != null) {
            try {
                mSocket.close();
            } catch (IOException ex) {
                //handle exception
            }
        }
        mSocket = null;
    }

    public void openSocket(String dstAddress, int portAddress) {
        mDstAddress = dstAddress;
        mDstPort = portAddress;
        ConnectSocket connect =
            new ConnectSocket(mDstAddress, mDstPort);
        connect.execute();
    }


public class ConnectSocket extends AsyncTask<Void, Void, Void> {
    String dstAddress;
    int dstPort;
    String response = "";

    ConnectSocket(String addr, int port) {
        dstPort = port;
        dstAddress = addr;
    }

    @Override
    protected Void doInBackground(Void... voids) {
            try {
                mSocket = new Socket(mDstAddress, mDstPort);
                mConnectionStatus = true;
            } catch (UnknownHostException e) {
                mConnectionStatus = false;
                response = "UnknownHostException: " + e.toString();
                e.printStackTrace();
                closeSocket();
            } catch (IOException e) {
                mConnectionStatus = false;
                response = "IOException: " + e.toString();
                e.printStackTrace();
                closeSocket();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if (response.contains("Exception")) {
                mConnectionStatus = false;
            } else {
                mConnectionStatus = true;
            }
            this.cancel(true);
            super.onPostExecute(aVoid);
        }
    }

MainActivity.java (только onServiceConnected):

@Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i(TAG, "onServiceConnected");
        MyService.LocalBinder binder = (MyService.LocalBinder) service;
        mService = binder.getService();
        mIsBound = true;
        int statusResult = mService.getConnectionStatus();
        Log.i(TAG, "statusResult: " + Integer.toString(statusResult));
        mDisplayNumber.setText(Integer.toString(statusResult));
        if (statusResult == 0) {
            createDialog();
        }
    }

Вы должны сделать это наоборот; попросите службу уведомить о действии, когда оно будет выполнено. См. Связанный пост, чтобы узнать, как это сделать.

Tim 11.10.2018 11:48

Большое спасибо ! Похоже, это тот пост ТАК, который я безнадежно искал, ахахах.

Juliette Marquis 11.10.2018 12:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
35
0

Другие вопросы по теме