2014-06-21 54 views
0

我有點困惑與線程Android上,基本上我想下載視頻文件,但我得到NetworkOnMainThreadExceptionAndroid - 獲取NetworkOnMainThreadException文件下載,即使下載開始在單獨的線程

我的設置如下,我有一個VideoDownloader類只有下載視頻。其主要方法如下所示:

public void downloadVideoFile(Context context, String videoURL, String targetFileName) 。這將打開與videoURL的http連接,並使用contextopenFileOutput方法和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也足以讓它在主線程上運行其方法,無論如何如果我把它交給一個單獨的線程?

任何人都可以幫助我改進這段代碼,使下載工作?

+0

爲什麼不使用'AsyncTask'而不是'Thread'? – SMR

回答

3

使用start()開始一個新的線程。 run()只是在當前線程中運行代碼。

+0

太棒了,它的工作,謝謝!我會盡快接受答案:) – nburk