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

时间:2013-08-28 14:52:51

标签: java http blackberry timertask ksoap

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

1 个答案:

答案 0 :(得分:1)

首先,我建议你不要扩展Thread,除非你需要覆盖自定义线程行为(通常情况并非如此,这样做太可怕了)。相反,the recommended approach是实现Runnable并将其传递给Thread构造函数。在JavaSE中,他们引入了一个新的Executors框架,它以旧的方式摆脱了实例化线程。使用定时器它是类似的,但在这里你实现了TimerTask,它几​​乎是Runnable(继承自它),然后你安排它。

你的代码的另一个问题是它从构造函数中启动一个线程,这是一件危险的事情,因为创建的每个新实例都会产生一个新线程(与Timer相关的线程)。这被认为是反模式。永远不要这样做,如果你这样做,请记录下来并确保使用这个课程的每个人都知道它。 (更多信息here)。同样令人困惑的是,一个扩展Thread的类在其构造函数中启动了一个Timer,它甚至不会覆盖run(什么是继承?)。

这些只是让您的代码更清晰,更安全的提示,但这不会解决您的问题。我认为问题可能在于您正在更新result变量,但您没有将其放入resultArray(或者您可能会忽略该代码?)。