布尔值在 onPostExecute 运行之前未更新
Boolean not updated before onPostExecute runs
我在将结果值返回到 Android 的异步 Class 中的 onBackground()
函数的 onPostExecute()
时遇到问题。
我想做的是使用 socket.io 在数据库中搜索指定的联系人姓名,然后当我找到它时; return
true
到 onPostExecute
以便在找到联系人后我可以在那里做一些事情。如果什么都没有找到,将返回 false
并在 onPostExecute()
中做一些其他的事情。
我将 boolean
全局值 "success" 分别设置为 true
或 false
并尝试将此值传递给 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
}
});
我在将结果值返回到 Android 的异步 Class 中的 onBackground()
函数的 onPostExecute()
时遇到问题。
我想做的是使用 socket.io 在数据库中搜索指定的联系人姓名,然后当我找到它时; return
true
到 onPostExecute
以便在找到联系人后我可以在那里做一些事情。如果什么都没有找到,将返回 false
并在 onPostExecute()
中做一些其他的事情。
我将 boolean
全局值 "success" 分别设置为 true
或 false
并尝试将此值传递给 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
}
});