布尔值在 onPostExecute 运行之前未更新

Boolean not updated before onPostExecute runs

我在将结果值返回到 Android 的异步 Class 中的 onBackground() 函数的 onPostExecute() 时遇到问题。

我想做的是使用 socket.io 在数据库中搜索指定的联系人姓名,然后当我找到它时; return trueonPostExecute 以便在找到联系人后我可以在那里做一些事情。如果什么都没有找到,将返回 false 并在 onPostExecute() 中做一些其他的事情。 我将 boolean 全局值 "success" 分别设置为 truefalse 并尝试将此值传递给 onPostExecute(),但由于某种原因,该值被分配 AFTER onPostExecute() 被调用...一定与异步操作有关,但由于我不是专家,我希望有人能给我一些提示,告诉我如何正确地做,以便 boolean 值已更新,BEFORE 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(); 
     }  
 }
 }

它发生是因为 doInBackground(...) returns 值在 new IOCallback() 的方法 on 被调用之前。 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);
}

并且只需在 class:

中调用此方法
yourMethod(asyncObject, new YourListener() {
    @Override
    public void ready(boolean value) {
            // copy here your code from onPostExecute
        }
    });