我对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
的事实足以让它在主线程上运行它的方法,不管我是不是把它交给一个单独的线程?
任何人都可以帮我改进这段代码,以便下载工作吗?
答案 0 :(得分:3)
使用start()
启动新主题。 run()
只运行当前线程中的代码。