私のアプリケーションには、私たちが呼び出す一時停止または再開(ファイルのダウンロード)などの要件があります。私のアプリケーションでは、Url のセットを順次または並列に呼び出す必要があり、呼び出しを完了するのにかかる時間を取得する必要があります。URL の呼び出し中に一時停止および再開するオプションがあります。どうすればそれを達成できますか。Async Task を試しましたが、一時停止と再開のオプションがありません。誰かがアイデアを持っている場合は、同じことを手伝ってください。
2 に答える
1 つの Web サービス呼び出しを一時停止/再開することはできません。HTTP プロトコルは単にそれをサポートしていません。HTTP/1.1 の keep-alive 接続を試してみることもできますが、それはかなり苦痛になる可能性があるため、使用しないことを強くお勧めします。代わりに、URL 呼び出しの間で一時停止する必要があります。つまり、1 つの呼び出しを行い、データを取得してから、次の呼び出しに進むか、次の呼び出しに進む前に一時停止します。
で簡単に実現できますAsyncTask
。boolean
クラスで、実行状態 (一時停止/実行) を保持するindicator
変数と型のメンバー変数を宣言しObject
ます。これは通知に必要です。
次に、doInBackground
URL のメソッド ループで、それぞれを順番に呼び出します。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 つのことを行う必要があります。
接続からの InputStream を手動で処理し、たとえば一度に 1024 バイトを読み取ります。合計でどれだけ読んだかを追跡します。各読み取りの後、「一時停止」が呼び出されていないことを確認してください。ある場合は、「再開」が呼び出されるまで待ちます。
再開が呼び出されたら、ストリームの読み取りを続行しようとします。ストリームがサーバー エンドによって閉じられた場合は、接続を再確立し、
Range
HTTP ヘッダーを使用してオフセットを指定します。たとえばRange: bytes=4096-
、サーバーがストリームのバイト 4096 以降から転送を再開するように要求します。すべてのサーバーがこのヘッダーをサポートしているわけではないことに注意してください。特定のサーバーがそうでない場合は、運が悪い.
実際の一時停止/再開/チェック ロジックは、上記と同じです。
HTTP プロトコル* を見てからしばらく経ちましたが、iirc ではパラメーターを設定して、出力ストリームのオフセットを示すことができます。これにより、以前に停止した場所からダウンロードを「再開」できます。明らかに、これにはサーバーがこの機能をサポートする必要があります。
※FTPプロトコルも混同している可能性があります。