在onPostExecute运行

时间:2015-06-28 23:29:24

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

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

我想要做的是使用socket.io在数据库中搜索指定的联系人名称,然后在找到它时; return trueonPostExecute,以便在找到联系人后可以在那里做点什么。如果未找到任何内容,则应返回false,并在onPostExecute()中执行其他操作。 我设定了boolean全球价值"成功"分别到truefalse并尝试将此值传递给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 个答案:

答案 0 :(得分: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
        }
    });