我有點困惑與線程Android上,基本上我想下載視頻文件,但我得到NetworkOnMainThreadException
。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
一個實例。
最後,在我的活動,我執行下面的方法:正如我在開頭所說的
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
也足以讓它在主線程上運行其方法,無論如何如果我把它交給一個單獨的線程?
任何人都可以幫助我改進這段代碼,使下載工作?
爲什麼不使用'AsyncTask'而不是'Thread'? – SMR