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