【发布时间】:2015-06-29 08:21:02
【问题描述】:
我在将结果值返回到 Android 异步类中 onBackground() 函数的 onPostExecute() 时遇到问题。
我想做的是使用socket.io在数据库中搜索指定的联系人姓名,然后找到它; return true 到 onPostExecute 以便在找到联系人后我可以在那里做点什么。如果什么都没找到,false 应该被退回,其他的事情应该在onPostExecute() 中做。
我将boolean 全局值“成功”分别设置为true 或false,并尝试将此值传递给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