1

ダウンロード中にファイルを停止/キャンセルするにはどうすればよいですか? urlconnection と inputstream を使用しています。コードは動作しますが、ダウンロードをキャンセルできません。ダウンロード用の私のコード:

            int count;
            try {
                URL url = new URL(f_url[0]);
                URLConnection conection = url.openConnection();
                conection.connect();
                int lenghtOfFile = conection.getContentLength();
                InputStream input = new                  BufferedInputStream(url.openStream(),8192);
                File myDir = getDir(Environment.DIRECTORY_MUSIC,
                        Context.MODE_PRIVATE);
                Intent i = getIntent();
                String name = i.getStringExtra("name");
                File mypath = new File(myDir, name + ".mp3");
                mypath.createNewFile();
                mypath.mkdirs();
                OutputStream output = new FileOutputStream(mypath);
                byte data[] = new byte[1024];
                long total = 0;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));
                    output.write(data, 0, count);
                }

                output.flush();

                output.close();
                input.close();

            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }

            return null;
        }
4

1 に答える 1

0

一般的な考え方は、定期的にチェックされるフラグ (外部スレッドから設定できる) を使用することです。

while (!cancelled && shouldDoStuff) { doStuff(); }

フラグを使用すると、コードを通常の完了まで実行し (まあまあ)、さまざまな「例外」を区別し、適切と思われる適切なクリーンアップ操作を実行できます。

現在、AsyncTaskチェック可能なフラグを介して適切なキャンセル メカニズムを既に提供しています。

[AsyncTask] タスクのキャンセル: タスクは、 を呼び出すことでいつでもキャンセルできますcancel(boolean)。このメソッドを呼び出すと、以降の呼び出しでisCancelled()true が返されます。.. タスクができるだけ早くキャンセルされるようにするには、isCancelled()定期的に ..の戻り値を常にチェックする必要があります。

上記のリンク先のドキュメントから抜粋したスニペット:

for (..) {                  // Keep going until done ..
  publishProgress(..);
  if (isCancelled()) break; // .. or until flagged.
}

(AsyncTask を使用するとvolatile、少なくとも必要なフラグの正しい実装など、面倒な詳細に対処できます。)

于 2013-10-29T21:12:12.483 に答える