Android でのスレッド化に少し混乱しています。基本的にはビデオ ファイルをダウンロードしたいのですが、NetworkOnMainThreadException
.
私のセットアップは次のとおりVideoDownloader
です。ビデオをダウンロードするためだけのクラスがあります。その主な方法は次のようになります。
public void downloadVideoFile(Context context, String videoURL, String targetFileName)
. これにより、 への http 接続が開かれ、のメソッドと をファイルの名前としてvideoURL
使用してファイル システムに保存されます。マルチスレッドについてはまだ考慮すべきことはありません。context
openFileOutput
targetFileName
次に、次のように a を実装して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
ダウンロードが機能するように、このコードを改善するのを手伝ってくれる人はいますか?