我的程序需要将用户的名称作为String,并调用API以查看它是否存在。我创建了一个接收该字符串的方法,并执行异步任务来发送API调用。但看起来我的方法中的比较正在异步任务完成之前执行。实现这样的事情的正确方法是什么
public boolean checkUser(String name) {
checkedName = name;
checkValidSummoner check = new checkValidSummoner();
check.execute();
if (checkedName == null) {
return false;
} else {
return true;
}
}
private class checkValidSummoner extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(String... strings) {
try {
checkedName = RiotAPI.getSummonerByName(checkedName).toString();
} catch (APIException e) {
checkedName = null;
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
}
}
答案 0 :(得分:0)
你不能这样做。
请使用听众。
public boolean checkUser(String name, OnCheckValidEndListener listener) {
checkedName = name;
checkValidSummoner check = new checkValidSummoner(listener);
check.execute();
}
public interface OnCheckValidEndListener {
void onCheckValidEnd(String checkedName);
}
private class checkValidSummoner extends AsyncTask<String, Void, Void> {
private final OnCheckValidEndListener listener;
checkValidSummoner(OnCheckValidEndListener listener) {
this.listener = listener;
}
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(String... strings) {
try {
checkedName = RiotAPI.getSummonerByName(checkedName).toString();
} catch (APIException e) {
checkedName = null;
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
listener.onCheckValidEnd(checkedName);
}
}
请使用流动代码
checkUser("jon",new OnCheckValidEndListener() {
@Override
public void onCheckValidEnd(String checkedName) {
if (checkedName == null) {
// invalid
} else {
// valid
}
}
});