안드로이드 개발 팁 #6 - 웹 브라우저를 여는 확장 메소드 작성

웹 브라우저 연결 코드

클릭 등과 같은 액션으로 특정 URL의 웹 페이지를 웹 브라우저로 열기 위해서는 Intent 객체를 다음과 같이 정의하고 그것을 실행하면 됩니다.

// 가정: 액티비티 클래스 안에서 이 코드 실행
val url = "https://www.google.com"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(intent)

문제점

위 코드로도 웹 브라우저를 여는 것은 문제 없습니다. 그런데 동일한 코드를 여러 곳에서 실행해야 한다면, 위 코드를 복사해서 쓰는 것은 코드의 가독성(readability)이 떨어집니다. 메소드로 정의하여 호출하는 것이 훨씬 좋습니다.


Activity 클래스의 확장 메소드 정의

위 코드를 실행하는 메소드를 구현할 건데요. Activity 클래스의 확장 메소드로 정의합니다. Java에서는 별도의 유틸 클래스를 정의해야 하는데, 유틸 클래스가 많아지는 것도 나중에 코드 관리의 어려움이 생깁니다. Kotlin에서는 확장 메소드를 구현할 수 있습니다.

fun Activity.openBrowser(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    startActivity(intent)
}

개선 - ActivityNotFoundException 예외 처래ㅣ

그런데 위 메소드를 만든다고 끝이 아닙니다. 왜냐면요. 웹 브라우저가 없는 태블릿 기기도 일부지만 있습니다. 그런 기기에서 메뉴를 클릭하여 웹 브라우저를 열려고 하면 ActivityNotFoundException 예외가 발생하여 앱이 강제 종료됩니다. 이런 문제가 사용자에게 보인다면, 앱의 품질은 낮아질 수 밖에 없죠. 위에 정의한 메소드에 예외 처리 코드까지 추가한다면, 보다 안정적인 앱을 만들 수 있습니다.

아래 코드는 위에서 정의한 메소드에 ActivityNotFoundException 예외 처리를 추가 적용한 것입니다.

fun Activity.openBrowser(url: String, exceptionHandler: (ex: ActivityNotFoundException) -> Unit = {}) {
    try {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
        startActivity(intent)
    }
    catch (e: ActivityNotFoundException) {
        e.printStackTrace()
        exceptionHandler(e)
    }
}

openBrowser 메소드에 exceptionHandler 함수 파라메터를 추가하였구요. 예외 처리시 이 함수를 호출합니다. 이 메소드를 호출할 때, 웹 브라우저 부재시 이를 알리는 팝업을 실행하는 람다 식(lambda expression)을 2번째 파라메터로 지정하면 좋습니다.

openBrowser("https://www.google.com") { ex ->
    // 예외 처리 예: 웹 브라우저가 없어서 실행할 수 없다는 팝업 띄우는 코드 작성
    // ex 파라메터는 사용하지 않아도 되지만, 혹시 필요할 수 있으니 추가해 두었음
}

마치며...

이번 포스트는 작지만 조금씩 코드를 개선하는 취지로 작성해 보았습니다. 코드 중복을 줄이고 간결한 코드를 만들려는 노력이 더 좋은 코드를 만드는 길이 될 것이라 믿습니다. 그 과정을 앞으로 만들어 가고 싶습니다.


지난 안드로이드 개발 팁

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.
default.jpg

Coin Marketplace

STEEM 0.21
TRX 0.14
JST 0.030
BTC 69812.20
ETH 3376.99
USDT 1.00
SBD 2.78