Boolean не обновляется до запуска onPostExecute

У меня проблема с возвратом значения результата onPostExecute() из onBackground() функция в асинхронном классе Android.

Я хочу найти указанное имя контакта в базе данных, используя socket.io, а затем, когда я его найду; returntrue в 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
        }
    });
Другие вопросы по тегам