0

Android でのスレッド化に少し混乱しています。基本的にはビデオ ファイルをダウンロードしたいのですが、NetworkOnMainThreadException.

私のセットアップは次のとおりVideoDownloaderです。ビデオをダウンロードするためだけのクラスがあります。その主な方法は次のようになります。

public void downloadVideoFile(Context context, String videoURL, String targetFileName) . これにより、 への http 接続が開かれ、のメソッドと をファイルの名前としてvideoURL使用してファイル システムに保存されます。マルチスレッドについてはまだ考慮すべきことはありません。contextopenFileOutputtargetFileName

次に、次のように 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

ダウンロードが機能するように、このコードを改善するのを手伝ってくれる人はいますか?

4

1 に答える 1

3

start()新しいスレッドを開始するために使用します。run()現在のスレッドでコードを実行するだけです。

于 2014-06-21T10:45:11.807 に答える