【问题标题】:Boolean not updated before onPostExecute runs在 onPostExecute 运行之前布尔值未更新
【发布时间】:2015-06-29 08:21:02
【问题描述】:

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

我想做的是使用socket.io在数据库中搜索指定的联系人姓名,然后找到它; return trueonPostExecute 以便在找到联系人后我可以在那里做点什么。如果什么都没找到,false 应该被退回,其他的事情应该在onPostExecute() 中做。 我将boolean 全局值“成功”分别设置为truefalse,并尝试将此值传递给onPostExecute(),但由于某种原因,该值是在调用onPostExecute() 之后分配的......必须有与异步操作有关,但由于我不是专家,我希望有人能给我一些提示,告诉我如何正确操作,以便在onPostExecute() 检查值之前更新boolean 值。

这是我的代码:

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(); 
     }  
 }
 }

【问题讨论】:

  • 您正在从 AsyncTask 后台线程启动另一个线程(通过调用 socket.connect)。你不能指望从第二个线程返回一些东西并让它与你的 AsyncTask 后台线程神奇地同步。
  • tru 使您的布尔变量静态化,以便在许多线程中不会有该变量的任何副本..

标签: android android-asynctask socket.io-java-client


【解决方案1】:

这是因为 doInBackground(...) 在调用 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);
}

然后在你的类中调用这个方法:

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

【讨论】:

  • 感谢您的帮助!我发现我仍然需要一些练习来了解所有这些线程是如何工作的,很高兴有一些专家在身边
猜你喜欢
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2013-08-01
  • 2016-10-07
相关资源
最近更新 更多