0

私のアプリケーションには、私たちが呼び出す一時停止または再開(ファイルのダウンロード)などの要件があります。私のアプリケーションでは、Url のセットを順次または並列に呼び出す必要があり、呼び出しを完了するのにかかる時間を取得する必要があります。URL の呼び出し中に一時停止および再開するオプションがあります。どうすればそれを達成できますか。Async Task を試しましたが、一時停止と再開のオプションがありません。誰かがアイデアを持っている場合は、同じことを手伝ってください。

4

2 に答える 2

2

1 つの Web サービス呼び出しを一時停止/再開することはできません。HTTP プロトコルは単にそれをサポートしていません。HTTP/1.1 の keep-alive 接続を試してみることもできますが、それはかなり苦痛になる可能性があるため、使用しないことを強くお勧めします。代わりに、URL 呼び出しの間で一時停止する必要があります。つまり、1 つの呼び出しを行い、データを取得してから、次の呼び出しに進むか、次の呼び出しに進む前に一時停止します。

で簡単に実現できますAsyncTaskbooleanクラスで、実行状態 (一時停止/実行) を保持するindicator変数と型のメンバー変数を宣言しObjectます。これは通知に必要です。

次に、doInBackgroundURL のメソッド ループで、それぞれを順番に呼び出します。1 つの呼び出しが完了したら、その変数を確認します。に設定されているfalse(つまりpause、呼び出されている) 場合は、true に設定されるまで待ちます。次のようにします。

for(each url in your list) {
    //make the call and retrieve the data
    ....
    if(!this.runState) { //pause has been called
        // the below code blocks until notified
        synchronized(indicator) {
            try {
                runState.wait();
            } catch (InterruptedException e) {
                // Nothing needs to be done here
            }
        }
    }
}

最後に、停止/再開メソッドが必要になります。

public synchronized void pause() {
    runState = false;
}

public synchronized void resume() {
    runState = true;
    //this code notifies the process (in the loop) to stop waiting
    synchronized(syncObject) {
        indicator.notify();
    }
}

アップデート

HTTP を使用してファイルのダウンロードを停止して再開するには、2 つのことを行う必要があります。

  1. 接続からの InputStream を手動で処理し、たとえば一度に 1024 バイトを読み取ります。合計でどれだけ読んだかを追跡します。各読み取りの後、「一時停止」が呼び出されていないことを確認してください。ある場合は、「再開」が呼び出されるまで待ちます。

  2. 再開が呼び出されたら、ストリームの読み取りを続行しようとします。ストリームがサーバー エンドによって閉じられた場合は、接続を再確立し、RangeHTTP ヘッダーを使用してオフセットを指定します。たとえばRange: bytes=4096-、サーバーがストリームのバイト 4096 以降から転送を再開するように要求します。すべてのサーバーがこのヘッダーをサポートしているわけではないことに注意してください。特定のサーバーがそうでない場合は、運が悪い.

実際の一時停止/再開/チェック ロジックは、上記と同じです。

于 2012-09-18T13:45:39.507 に答える
0

HTTP プロトコル* を見てからしばらく経ちましたが、iirc ではパラメーターを設定して、出力ストリームのオフセットを示すことができます。これにより、以前に停止した場所からダウンロードを「再開」できます。明らかに、これにはサーバーがこの機能をサポートする必要があります。

※FTPプロトコルも混同している可能性があります。

于 2012-09-18T15:03:49.567 に答える