我正在 TimerTask 中使用 kSoap 进行 http 调用,这样我就可以每五分钟更新一次数据。从 Web 服务获取数据后,我通过函数 processcssData() 将它们提供给接口(interface)。这是第一次完美地工作,但是尽管每次数据保持不变时计时器都会触发。事实上,我的 UI 每五分钟绘制一次,但它始终使用第一个 http 调用中的数据。有人知道为什么会发生这种情况吗?在我看来,httpCall() 函数内的变量没有被更新。
public class ConnectionThread extends Thread {
SoapObject request;
SoapObject result;
SoapSerializationEnvelope envelope;
String[][] resultArray;
int resultLength;
public ConnectionThread(ConnectionCallback conCallback) {
callbackObj = conCallback;
refreshTask = new TimerTask() {
public void run() {
httpCall();
}
};
new Timer().schedule(refreshTask, 0, 50000);
}
public void httpCall() {
request = new SoapObject(serviceNamespace, methodName);
result = null;
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
http = new HttpTransport(serviceUrl);
try {
http.call(soapAction, envelope);
result = (SoapObject) envelope.getResponse();
resultLength = result.getPropertyCount();
} catch (final InterruptedIOException ex) {
Dialog.alert("No Internet Connection!");
_isConnected = false;
}
// some other catch blocks
finally {
http.reset();
}
resultArray = new String[resultLength][resultLength * 8];
// put result into own Stringarray
if (_isConnected) {
callbackObj.processData(resultArray, resultLength);
}
}
}
任何帮助将不胜感激! :) 干杯,Musipoo
最佳答案
首先,我建议您不要扩展Thread
,除非您需要覆盖自定义线程行为(通常情况并非如此,而且这样做太可怕了)。相反,the recommended approach是实现一个 Runnable 并将其传递给 Thread 构造函数。在 JavaSE 中,他们引入了一个新的 Executors 框架,该框架摆脱了旧的实例化线程的方式。对于计时器来说,情况类似,但在这里您实现了一个 TimerTask
,它几乎是一个 Runnable
(继承自它),然后您安排它。
代码的另一个问题是它从构造函数中启动一个线程,这是一件危险的事情,因为创建的每个新实例都会生成一个新线程(与计时器关联的线程)。这被认为是反模式。切勿这样做,如果这样做,请记录下来并确保使用此类的每个人都知道它。 (更多信息here)。另外,令人困惑的是,扩展 Thread 的类在其构造函数中启动 Timer,并且它甚至没有覆盖 run
(继承是为了什么?)。
这些只是让您的代码更清晰、更安全的提示,但这并不能解决您的问题。我认为问题可能在于您正在更新 result
变量,但没有将其放入 resultArray
(或者您可能省略了该代码?)。
关于java - HTTP 连接线程不更新 TimerTask 内的结果 - BlackBerry Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491353/