java - Android - 即使下载是在单独的线程中启动的,但文件下载也会出现 NetworkOnMainThreadException

标签 java android multithreading runnable networkonmainthread

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

我的设置如下,我有一个 VideoDownloader 类,该类仅用于下载视频。它的主要方法如下所示:

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

然后我正在实现一个 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 实例,在自己的线程中启动视频下载。

最后,在我的 Activity 中,我执行以下方法:

    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 的实例,这足以让它在主线程,无论我是否将其交给单独的线程?

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

最佳答案

使用start()启动一个新线程。 run() 只是运行当前线程中的代码。

关于java - Android - 即使下载是在单独的线程中启动的,但文件下载也会出现 NetworkOnMainThreadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340793/

相关文章:

java - 如何获取 Groovy 类的所有属性名称?

android - 我想在 android 中将音频服务器 (/frameworks/av/media/audioserver) 构建为 64 位,但它无法启动

相当于早期 sdk 的 Android gridview

android - 如何以编程方式修改 Android Pie 9.0 中的 AOSP SystemUI?

c++ - pthread 与 NSThread : which is faster

linux - 生产者-消费者模式不适合我们的应用程序?或者只是使用上的误解?

java - powershell为每个文件构建一个字符串来执行

java - MoneyFormatter::parseMoney 抛出 MoneyFormatException

java - 在线存储java对象

c# - 计算多个线程中的东西