2

冗長な質問だとは思わないでください。よくお読みください。

AsyncTaskのdoInBackground(Void ... params)内に無限ループがあります。そして、doInBackground()内にコールバック関数があります。そのため、cancel()、onCancelled()、およびisCancelled()アプローチを使用してこのタスクを終了することはできません。問題は、実行がコールバック関数で永久に待機することです。したがって、(doInBackground内の)どこにこのisCancelled()チェックを記述して無限ループから抜け出しても、実行されません。

誰かがこの種の問題の解決策を持っていますか?または、誰かがこれに似た要件を持っていましたか?

@Override
protected void onCancelled()
{
    // Socket Close
}

@Override
    protected Void doInBackground(Void... params)
    {
        try
        {
            // Socket Open

            while (true)
            {

                socket.receive();
            }
        }
        catch (Exception e)
        {

        }
        return null;
    }
4

3 に答える 3

1

受信操作を開始する前socket.setSoTimeout(int timeout)に、必要に応じて呼び出してタイムアウトを設定します(通常、データを少し待つ場合は、1000ミリ秒以下を使用できます。データの受信に時間がかかる場合は、より大きな値を使用してください。たとえば10000ms)。

次に、ループ内のsocket.receiveメソッドの後で、タスクがキャンセルされたかどうかを確認し(isCancelled() == true)、キャンセルされた場合はループから抜け出します。

于 2012-11-08T23:42:23.513 に答える
1
        @Override
    protected void onCancelled()
    {
        // Socket Close
    }

    @Override
        protected Void doInBackground(Void... params)
        {
            try
            {
                // Socket Open

                while (!isCancelled())
                {

                    socket.receive();
                    OnProgressUpdate(...);
                }
            }
            catch (Exception e)
            {

            }
            return null;
        }
    @Override
        protected void onProgressUpdate(...) {
                receiveing=true;
            }

boolean receiveing;

あなたが何を達成しようとしているのかわからず、質問が明確ではなかったため、これがあなたの求めているものかどうかわかりません. 必要な場所に cancel() を配置します。
そして、無限ループは良い考えではありません...

于 2012-11-08T23:35:11.467 に答える
1

でタイムアウトを使用する必要がありますsocket.receive()。そのため、時々制御を に戻し、そこでループAsyncTaskをチェックして終了することができます。isCancelled()

于 2012-11-08T23:22:51.360 に答える