2017-09-27 3 views
0

私はいつかサービスを実行するアンドロイドアプリに取り組んでいます。そのサービスは、時間のかかる操作のために新しいスレッドを実行し、countDownLatchがゼロになるのを待ちます。その後、別の時間を要する操作のために2番目のスレッドを実行します(新しいスレッドは現在必要ではなく、近い将来に実行されます)。CountDownLatch.await()バックグラウンドスレッドをサスペンド

now ... downloadThreadを開始した後、次のように待機すると、メインスレッドとdownloadThreadが操作を一時停止します。しかし、私がuploadThread内のcountDownLatchを待つと、すべて正常に動作します。

Thread downloadThread = new Thread(new Runnable() { 
@Override 
public void run() { 
    downloadFiles(mMediaFileList); 
} 
}); 

downloadThread.start(); 

try { 
Log.d("UploadMedia", "Waiting for DownloadMedia to finish"); 
mCountDownLatch.await(); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 

Thread uploadThread = new Thread(new Runnable() { 
@Override 
public void run() { 
    uploadMedia(); 
} 
}); 

uploadThread.start(); 

これは実際問題ではありませんが、どちらの方法でも動作するはずはありませんか? .await()機能について私が見逃していることはありますか?

乾杯!

編集: FYI、downloadFilesには、タスクの完了または失敗を待つコールバックがあります。それらのコールバックが.await()によって中断されているメインスレッド上で動作することができますか?

答えて

0

ラッチがカウントダウンする場所は明白ではありません。しかし、それはuploadMedia()中に起こるように聞こえる。その場合は、ラッチをゼロまでカウントできる他の制御フローがないため、メインスレッドはlatch.await()に失効します。

+0

あなたのご意見ありがとうございます!実際、ラッチはdownloadMedia内でカウントダウンされます。ラッチがゼロになると、すべてのファイルがダウンロードされたことを意味します。 uploadMediaは利用可能なすべてのファイルを取得してアップロードします。 downloadFiles内でコールバックを実装するメソッドは、サードパーティ製のライブラリからのものです。その理由は、それらのコールバックがどこに送られたかについてはわかりません。 – Koopa

関連する問題