我对 Android 上的线程有点困惑,基本上我想下载视频文件,但我得到了一个NetworkOnMainThreadException
.
我的设置如下,我有一个VideoDownloader
只下载视频的课程。它的主要方法是这样的:
public void downloadVideoFile(Context context, String videoURL, String targetFileName)
. 这将打开一个到 的 http 连接,并使用'方法videoURL
将其保存到文件系统中,并将'作为文件的名称。关于多线程还没有什么可考虑的。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
在初始化期间的实例。
最后,在我的活动中,我正在执行以下方法:
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
线程上的 也足以让它在主线程上运行它的方法,不管我是否将它交给一个单独的线程?
任何人都可以帮我改进这段代码以便下载工作吗?