java - HTTP 连接线程不更新 TimerTask 内的结果 - BlackBerry Java

标签 java http blackberry timertask ksoap

我正在 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/

相关文章:

java - 填充Webview内容时的Android底部白色条纹

java - 设置按钮事件后可聚焦

java - App Engine Java JDO 中的单元测试 XG 跨组事务

java - 如何使用 Jackson 将 JSON 数组中的嵌套值解析到列表中

php - 对 HTTP Post 请求采取操作

python - Flask 更新 SQLite 记录

python-2.7 - Python2.7 --重构数据包打印html

blackberry - 在 BlackBerry OS 10 上安装 COD 文件

java - 黑莓 JDE FieldChangeListener

java - 自定义列表字段点击事件