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 回答