Boolean не обновляется до запуска onPostExecute
У меня проблема с возвратом значения результата onPostExecute()
из onBackground()
функция в асинхронном классе Android.
Я хочу найти указанное имя контакта в базе данных, используя socket.io, а затем, когда я его найду; return
true
в onPostExecute
так что я могу сделать что-то там, когда контакт был найден. Если ничего не найдено, false
должны быть возвращены и что-то еще должно быть сделано в onPostExecute()
, Я установил boolean
глобальное значение "успеха" для true
или же false
соответственно и попробуйте передать это значение onPostExecute()
, но по какой-то причине значение присваивается ПОСЛЕ onPostExecute()
называется... должен иметь какое-то отношение к асинхронной операции, но, поскольку я не эксперт, я надеюсь, что кто-то может дать мне подсказку о том, как сделать это правильно, чтобы boolean
значение обновляется, ДО onPostExecute()
проверяет значение.
Это мой код:
public class AsynchronicTask extends AsyncTask<Object, Void, Boolean> {
SocketIO socket = null;
AsyncObject asyncObject = null;
Boolean success = false;
@Override
protected Boolean doInBackground(final Object... argument) {
this.asyncObject = (AsyncObject) argument[0];
try {
System.out.println("Trying to connect to: "
+ asyncObject.getURL());
socket = new SocketIO(asyncObject.getURL());
socket.connect(new IOCallback() {
@Override
public void onConnect() {
JSONObject queriedUsername = new JSONObject();
try {
queriedUsername.put("Username", asyncObject.getQueryInput());
} catch (JSONException e) {
e.printStackTrace();
}
socket.emit("clientRequestSearchUsername", queriedUsername);
}
@Override
public void onDisconnect() {
}
@Override
public void onError(SocketIOException arg0) {
}
@Override
public void onMessage(String arg0, IOAcknowledge arg1) {
}
@Override
public void onMessage(JSONObject arg0, IOAcknowledge arg1) {
}
@Override
public void on(final String message, IOAcknowledge argIO,
final Object ... arg) {
if (message.equals(asyncObject.getServerMessage())) {
if (arg[0].equals("null")) {
Log.e("ERROR", "No Result Found");
success = false;
} else {
success = true;
Log.d("DEBUG", "RESULT OK!");
}
};
}
});
} catch (MalformedURLException e) {
Log.e("error", "Wrong Server URL");
e.printStackTrace();
}
return success;
}
@Override
protected void onPostExecute(Boolean result) {
Log.d("DEBUG", result.toString());
// Give reply when username query has finished
if (result.equals(true)){
Log.d("DEBUG", "Contact found, adding to contactlist");
// Populate data in contactViewAdapter
asyncObject.getContactListAdapter().populateAdapter(asyncObject.getQueryInput());
Toast.makeText(asyncObject.getContext(), "Contact added", Toast.LENGTH_SHORT).show();
}
else {
Log.d("DEBUG", "No Success adding contact, no contact found");
Toast.makeText(asyncObject.getContext(), "Username not existent, no contact added", Toast.LENGTH_SHORT).show();
}
}
}
1 ответ
Это происходит потому что doInBackground(...)
возвращает значение перед методом on
из new IOCallback()
называется. SocketIO устанавливает соединение в фоновом потоке, поэтому ему нужно некоторое время для этого действия. Ваше решение: не используйте AsyncTask. Просто создайте что-то вроде этого:
void yourMethod (AsyncObject asyncObject, YourListener listener) {
System.out.println("Trying to connect to: " + asyncObject.getURL());
socket = new SocketIO(asyncObject.getURL());
socket.connect(new IOCallback() {
@Override
public void onConnect() {
JSONObject queriedUsername = new JSONObject();
try {
queriedUsername.put("Username", asyncObject.getQueryInput());
} catch (JSONException e) {
e.printStackTrace();
}
socket.emit("clientRequestSearchUsername", queriedUsername);
}
@Override
public void onDisconnect() {
}
@Override
public void onError(SocketIOException arg0) {
}
@Override
public void onMessage(String arg0, IOAcknowledge arg1) {
}
@Override
public void onMessage(JSONObject arg0, IOAcknowledge arg1) {
}
@Override
public void on(final String message, IOAcknowledge argIO,
final Object ... arg) {
if (message.equals(asyncObject.getServerMessage())) {
boolean success;
if (arg[0].equals("null")) {
Log.e("ERROR", "No Result Found");
success = false;
} else {
success = true;
Log.d("DEBUG", "RESULT OK!");
}
listener.ready(success);
}
}
}
}
Кодекс YourListener
:
public interface YourListener {
public void ready(boolean value);
}
И просто вызовите этот метод в своем классе:
yourMethod(asyncObject, new YourListener() {
@Override
public void ready(boolean value) {
// copy here your code from onPostExecute
}
});