0

我对 Android 上的线程有点困惑,基本上我想下载视频文件,但我得到了一个NetworkOnMainThreadException.

我的设置如下,我有一个VideoDownloader只下载视频的课程。它的主要方法是这样的:

public void downloadVideoFile(Context context, String videoURL, String targetFileName) . 这将打开一个到 的 http 连接,并使用'方法videoURL将其保存到文件系统中,并将'作为文件的名称。关于多线程还没有什么可考虑的。contextopenFileOutputtargetFileName

然后我正在实现VideoDownloadTask如下所示:

public class VideoDownloadTask extends Thread {

  private VideoDownloader videoDownloader;

  public VideoDownloadTask(VideoDownloader videoDownloader){
    this.videoDownloader = videoDownloader;
  }

  @Override
  public void run() {
    videoDownloader.startDownload();
  }

  public void cancel(){
    Log.d(Constants.LOG, "DEBUG [" + getClass().getName() + "]: Cancel current downloaded in video downloader");
    videoDownloader.cancel();

  }
}

这个类应该在它自己的线程中开始一个视频下载,给定一个VideoDownloader在初始化期间的实例。

最后,在我的活动中,我正在执行以下方法:

    private void initiateFileDownload() {

      Intent intent = getIntent();
      String seriesName = intent.getStringExtra("seriesName");
      String amazonKey = intent.getStringExtra("amazonKey");
      String videoURL = intent.getStringExtra("videoURL");

      URIGenerator uriGenerator = new URIGenerator();
      String targetFilePath = uriGenerator.buildTargetFilePath(seriesName, amazonKey);
      Log.d(Constants.LOG, "DEBUG [" + getClass().getName() + "]: Initiate file download to file: " + targetFilePath);

      VideoDownloader videoDownloader = new VideoDownloader(this, videoURL, targetFilePath);

      videoDownloadTask = new VideoDownloadTask(videoDownloader);
      videoDownloadTask.run();
    }

正如我在开始时所说,这段代码抛出一个NetworkOnMainThreadException,但我想知道为什么,因为根据我的理解,我正在一个单独的线程(在VideoDownloadTask)中执行视频下载,或者我错了,我创建了实例主VideoDownloader线程上的 也足以让它在主线程上运行它的方法,不管我是否将它交给一个单独的线程?

任何人都可以帮我改进这段代码以便下载工作吗?

4

1 回答 1

3

用于start()启动新线程。run()只需在当前线程中运行代码。

于 2014-06-21T10:45:11.807 回答