Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-获取NetworkOnMainThreadException进行文件下载,即使下载是在单独的线程中启动的_Java_Android_Multithreading_Runnable_Networkonmainthread - Fatal编程技术网

Java Android-获取NetworkOnMainThreadException进行文件下载,即使下载是在单独的线程中启动的

Java Android-获取NetworkOnMainThreadException进行文件下载,即使下载是在单独的线程中启动的,java,android,multithreading,runnable,networkonmainthread,Java,Android,Multithreading,Runnable,Networkonmainthread,我对Android上的线程有点困惑,基本上我想下载视频文件,但我得到了一个NetworkOnMainThreadException 我的设置如下,我有一个VideoDownloader类,它只用于下载视频。其主要方法如下所示: public void下载视频文件(上下文上下文、字符串videoURL、字符串targetFileName) 。这将打开到videoURL的http连接,并使用context的openFileOutput方法和targetFileName作为文件名将其保存到文件系统。关

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

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

public void下载视频文件(上下文上下文、字符串videoURL、字符串targetFileName)
。这将打开到
videoURL
的http连接,并使用
context
openFileOutput
方法和
targetFileName
作为文件名将其保存到文件系统。关于多线程还没有考虑。

然后我实现了一个
视频下载任务
,如下所示:

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
的实例,这一事实足以让它在主线程上运行它的方法,不管我是否将它交给一个单独的线程


有人能帮我改进这段代码以便下载正常吗?

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

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

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

使用
start()
启动新线程<代码>运行()只在当前线程中运行代码。

为什么不使用
AsyncTask
而不是
thread
?为什么不使用
AsyncTask
而不是
thread
?为什么不使用
AsyncTask
而不是
thread
?很好,它起作用了,谢谢!!我将尽快接受答案:)太好了,它起作用了,谢谢!!我将尽快接受答案:)太好了,它起作用了,谢谢!!我将尽快接受答案:)太好了,它起作用了,谢谢!!我会尽快接受答案:)