我对 Android 上的线程有点困惑,基本上我想下载视频文件,但我收到了 NetworkOnMainThreadException
。
我的设置如下,我有一个 VideoDownloader
类,该类仅用于下载视频。它的主要方法如下所示:
public void downloadVideoFile(Context context, String videoURL, String targetFileName)
。这将打开到 videoURL
的 http 连接,并使用 context
的 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
实例,在自己的线程中启动视频下载。
最后,在我的 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/