这是我的代码,在我的课程中,我已经将ansResultinThread变量声明如下。
protected static String ansResultinThread = "";
我在callServerForResult方法完成后尝试访问ansResultinThread值。我没有收到更新的值。
public void callServerForResult(String ans, String casCmd) {
// String ParsedEquation = parseQuestionForSymPy(ans);
String ParsedEquation = ans;
final String stringUrl = "http://localhost:40001/" + casCmd + "/"
+ ParsedEquation;
new Thread(new Runnable() {
public void run() {
String Result = "";
try {
Result = GetServerResult(stringUrl);
} catch (IOException e) {
System.out.println(e);
}
ansResultinThread = Result;
}
}).start();
}
如何解决此问题。
答案 0 :(得分:1)
好吧,因为它是异步发生的,你需要使用Future接口(参见这里:http://www.vogella.com/tutorials/JavaConcurrency/article.html,8。期货和可赎回)
答案 1 :(得分:1)
您的解决方案不起作用,因为callServerForResult
在线程启动后立即返回。
另请注意,使用具有多个线程的静态变量通常不是一个好主意。
我认为最简单的解决方案是使用AsyncTask
代替Thread
。
如果你想保留Thread
,另一个解决方案是使用回调。
private final Handler handler = new Handler();
// Definition of the callback interface
public interface Callback {
void onResultReceived(String result);
}
public void callServerForResult(String ans, String casCmd, final Callback callback) {
// String ParsedEquation = parseQuestionForSymPy(ans);
String ParsedEquation = ans;
final String stringUrl = "http://localhost:40001/" + casCmd + "/"
+ ParsedEquation;
new Thread(new Runnable() {
public void run() {
try {
final String result = GetServerResult(stringUrl);
// Use a handler to invoke the callback on the main thread
handler.post(new Runnable() {
public void run() {
callback.onResultReceived(result);
}
});
} catch (IOException e) {
System.out.println(e);
}
}
}).start();
}
// Usage
callServerForResult("...", "...", new Callback() {
public void onResultReceived(String result) {
// Do something with the result
}
});
如果回调代码需要在与调用者(通常是主线程)相同的线程上运行,则Handler
是必需的