我在TimerTask中使用kSoap进行http调用,所以我可以每5分钟更新一次数据。从Web服务获取数据后,我通过函数procecssData()将它们提供给接口。这是第一次完美地运行,但是每次数据保持不变时计时器都会触发。所以事实上,我的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
答案 0 :(得分:1)
首先,我建议你不要扩展Thread
,除非你需要覆盖自定义线程行为(通常情况并非如此,这样做太可怕了)。相反,the recommended approach是实现Runnable
并将其传递给Thread
构造函数。在JavaSE中,他们引入了一个新的Executors框架,它以旧的方式摆脱了实例化线程。使用定时器它是类似的,但在这里你实现了TimerTask
,它几乎是Runnable
(继承自它),然后你安排它。
你的代码的另一个问题是它从构造函数中启动一个线程,这是一件危险的事情,因为创建的每个新实例都会产生一个新线程(与Timer相关的线程)。这被认为是反模式。永远不要这样做,如果你这样做,请记录下来并确保使用这个课程的每个人都知道它。 (更多信息here)。同样令人困惑的是,一个扩展Thread的类在其构造函数中启动了一个Timer,它甚至不会覆盖run
(什么是继承?)。
这些只是让您的代码更清晰,更安全的提示,但这不会解决您的问题。我认为问题可能在于您正在更新result
变量,但您没有将其放入resultArray
(或者您可能会忽略该代码?)。