5

AysncTaskdoInBackground()メソッド内に大きなファイルをダウンロードするサービスがあります。

data = new byte[8192];
output = new FileOutputStream(fileLoc);
connection = (HttpURLConnection) new URL(currUrl).openConnection();
input = new BufferedInputStream(connection.getInputStream());
while ((count = input.read(data)) != -1) {
    output.write(data, 0, count);
}

これが実行されている間 (ファイルがダウンロードされている間) をスクロールするListViewと、少し途切れたり、非常に途切れたりすることがあります。

doInBackground()ダウンロードサービス用の新しいプロセスを作成し、スレッドの優先度を変更し、whileループ中に任意のミリ秒数だけ一時停止して、メモリ使用量を最適化しました。

ダウンロード中に UI が途切れないようにする方法がわかりません。ダウンロードが行われていない間、UI は正常に応答します...

4

1 に答える 1

5

ドキュメントには次のように記載されています。

AsyncTask はヘルパー クラスとして設計されておりThreadHandler一般的なスレッド フレームワークを構成するものではありません。AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、パッケージによって提供されるさまざまな API を使用することを強くお勧めjava.util.concurrentします。ExecutorThreadPoolExecutorFutureTask

そのため、サービス内での使用を検討してThreadください。または、 を見てくださいIntentService。別のワーカー スレッドで実行され、UI には影響しません (回避するためNetworkOnMainThreadException)。についての注意IntentService:

すべてのリクエストは 1 つのワーカー スレッドで処理されます。必要なだけ時間がかかる場合がありますが (アプリケーションのメイン ループをブロックすることはありません)、一度に処理されるリクエストは1 つだけです。

UI は別の部分です。あなたのアプローチを提供することができれば、おそらく私は助けることができると思います. たとえば、私のアプリのダウンロード拡張機能は今のところ問題なく動作しています:-)

于 2013-03-11T22:53:55.557 に答える