【发布时间】:2013-08-28 14:52:51
【问题描述】:
我正在 TimerTask 中使用 kSoap 进行 http 调用,因此我可以每五分钟更新一次数据。从 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
【问题讨论】:
-
ConnectionCallback是有权访问 UI 的对象吗?这就是我想看的。 -
我认为一般建议是避免在 TimerTask 中运行阻塞代码,或任何长时间运行的代码。让 TimerTask 触发(启动)连接线程,而不是运行连接代码。
-
@Sotirios Delimanolis
ConnectionCallback是向 UI 提供数据的接口。但它在第一次运行时得到了正确的数据,所以引用应该没问题吧? -
@Peter 感谢您的建议,我会尝试这种方法。但是区别在哪里,因为线程实际上在做同样的事情呢?
-
AFAIK,不同之处在于 TimerTask 实际上运行在管理 TimerTasks 的同一线程上,因此通过长时间运行进程,尤其是可能失败的进程,您正在损害未来的 Timer 事件。跨度>
标签: java http blackberry timertask ksoap