Я разрабатываю приложение для 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();
}
}
Большое спасибо ! Похоже, это тот пост ТАК, который я безнадежно искал, ахахах.




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