EnjoyLife

Queue 구조로 다운로드 하기 본문

안드로이드 개발/개발팁

Queue 구조로 다운로드 하기

Aiden96 2024. 11. 5. 10:01
// 다운로드 대기열을 저장하는 리스트, 두 번째 요소는 Any 타입으로 파라미터로 대체 가능
private val downloadQueue = mutableListOf<Triple<String, Any, Int>>()
var isDownloading = false

fun main() {
    // 대기열에 항목 추가
    addToDownloadQueue("http://example.com/file1.zip", "day1", 1)
    addToDownloadQueue("http://example.com/file2.zip", "day2", 2)
    addToDownloadQueue("http://example.com/file3.zip", "day3", 3)
    
    // 특정 pos 값을 가진 항목 제거
    removeFromDownloadQueue(2)  // Position이 2인 항목을 제거
    removeFromDownloadQueue(4)  // Position이 4인 항목을 찾을 수 없음
}

// 대기열에 항목을 추가하는 함수
fun addToDownloadQueue(downloadUrl: String, customParam: Any, pos: Int) {
    downloadQueue.add(Triple(downloadUrl, customParam, pos))
    println("Added to downloadQueue: $downloadQueue")
    processDownloadQueue()
}

// 특정 pos 값을 가진 항목을 대기열에서 제거하는 함수
fun removeFromDownloadQueue(pos: Int) {
    // 대기열에서 pos 값을 가진 항목을 찾기
    val itemToRemove = downloadQueue.find { it.third == pos }
    
    // 항목이 존재하면 제거
    if (itemToRemove != null) {
        downloadQueue.remove(itemToRemove)
        println("Removed item with Position: $pos from downloadQueue")
    } else {
        println("Item with Position: $pos not found in downloadQueue")
    }
    
    println("Current downloadQueue: $downloadQueue")
}

// 대기열을 동기적으로 처리하는 함수
fun processDownloadQueue() {
    if (isDownloading || downloadQueue.isEmpty()) return

    val (downloadUrl, customParam, pos) = downloadQueue.first()
    isDownloading = true
    println("Downloading from URL: $downloadUrl, Custom Param: $customParam, Position: $pos")

    simulateDownload()

    isDownloading = false
    downloadQueue.removeAt(0)
    processDownloadQueue()
}

// 동기적 다운로드 시뮬레이션 함수
fun simulateDownload() {
    Thread.sleep(2000)
}