0

TimerTask 内で kSoap を使用して http 呼び出しを行っているため、5 分ごとにデータを更新できます。Web サービスからデータを取得した後、関数 procecssData() を介してインターフェイスに提供します。これは初めて完全に機能しますが、データが同じままであるたびにタイマーが起動します。実際、UI は 5 分ごとに描画されますが、常に最初の 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);
    }
}
}

どんな助けでも大歓迎です!:) 乾杯、ムシプー

4

1 に答える 1

1

Threadまず第一に、カスタム スレッドの動作をオーバーライドする必要がない限り、拡張しないことをお勧めします (そうでない場合が多く、実行するにはあまりにも恐ろしいことです)。代わりに、 a を実装してコンストラクターに渡す方法をお勧めします。JavaSE では、古い方法でインスタンス化されたスレッドを取り除く新しい Executors フレームワークが導入されました。タイマーの場合も同様ですが、ここではほぼ a である a を実装し(継承)、それをスケジュールします。RunnableThreadTimerTaskRunnable

コードのもう 1 つの問題は、コンストラクター内からスレッドを開始することです。これは、作成されるすべての新しいインスタンスが新しいスレッド (タイマーに関連付けられたスレッド) を生成するため、危険なことです。これはアンチパターンと見なされます。これは絶対に行わないでください。行う場合は、それを文書化し、このクラスを使用するすべての人がそれについて知っていることを確認してください。(詳細はこちら)。また、Thread を拡張するクラスがそのコンストラクターで Timer を起動し、オーバーライドさえしないことも混乱を招きますrun(継承は何のために行われるのでしょうか?)。

これらは、コードをより明確にし、少し安全にするためのヒントにすぎませんが、それで問題が解決するわけではありません。問題は、変数を更新しているが、resultそれを入れていないことにあると思いresultArrayます(または、そのコードを省略したのでしょうか?)。

于 2013-08-30T08:33:17.353 に答える