我正在开发Android应用,现在我正在为登录系统编写一些方法。我正在尝试创建一个boolean
方法,根据服务器的响应返回true或false。这是我的代码:
public static boolean login(final String name, final String password) {
final boolean result;
Thread nt = new Thread() {
@Override
public void run() {
URL url;
HashMap<String, String> postDataParams = new HashMap<String, String>();
postDataParams.put("name", name);
postDataParams.put("password", password);
try {
url = new URL("");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.flush();
writer.close();
os.close();
int responseCode = conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
e.printStackTrace();
}
}
};
nt.start();
}
问题是每个return语句都会突出显示,因为cannot return a value from a method with void result type
是我无法理解的,因为它明确定义为boolean
方法。我想,它与我创建的新线程有关,但由于这个应用程序将在Android设备上运行,我必须在一个单独的线程中运行我的查询。
提前致谢!
答案 0 :(得分:3)
您的所有代码都在public void run()
方法中,该方法返回void
。
因此,不允许返回boolean
。
答案 1 :(得分:0)
关于范围。您无法启动新线程,然后从线程范围内返回值。 Thread类中的run()
方法具有void返回类型。
您必须删除该线程,然后将代码直接放在方法中。但是因为它是android,它不允许主线程上的连接,所以你必须创建一个回调接口,一旦站点被加载到线程内,你可以在接口内调用一个方法,结果为:true或false。
答案 2 :(得分:0)
正如其他人所指出的,编译错误的原因是您试图在匿名run()
实例的Runnable
方法中返回一个值。 run()
方法是一种void方法。
在评论中,你问过如何修复它&#34;这样您的login
方法就可以返回结果。
简单的答案是摆脱线程和run()
方法并直接在login
方法中完成工作; e.g。
public static boolean login(final String name, final String password) {
try {
URL url = new URL("some url");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
// write the post data ...
writer.flush();
writer.close();
os.close();
int responseCode = conn.getResponseCode();
return (responseCode == HttpsURLConnection.HTTP_OK);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
如果login
必须返回一个值,那么该方法返回时该值必须可用。它是同步的。如果你在(另一个)线程中完成工作,那么当前线程必须1)等待其他线程完成,并且2)从该线程获得结果。你可以做到,但没有意义。
如果你的目标是在调用login
时避免阻止当前线程,那么login
方法需要返回Future
或类似的东西。但最终,使用登录成功/失败状态的代码需要调用Future.get
。这可能需要等待结果,因此阻塞线程。
最佳答案可能是重新设计用户界面的状态机。