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

时间:2014-06-21 10:43:17

标签: java android multithreading runnable networkonmainthread

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

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

public void downloadVideoFile(Context context, String videoURL, String targetFileName) 。这将打开与videoURL的http连接,并使用context的{​​{1}}方法将其保存到文件系统,并将openFileOutput作为文件的名称。尚未考虑多线程。

然后我实现了一个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

正如我在开头所说,这段代码抛出一个 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的事实足以让它在主线程上运行它的方法,不管我是不是把它交给一个单独的线程?

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

1 个答案:

答案 0 :(得分:3)

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