Java Android-获取NetworkOnMainThreadException进行文件下载,即使下载是在单独的线程中启动的
我对Android上的线程有点困惑,基本上我想下载视频文件,但我得到了一个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作为文件名将其保存到文件系统。关
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
?很好,它起作用了,谢谢!!我将尽快接受答案:)太好了,它起作用了,谢谢!!我将尽快接受答案:)太好了,它起作用了,谢谢!!我将尽快接受答案:)太好了,它起作用了,谢谢!!我会尽快接受答案:)