PersesTitan(페르) 기술블로그

[AndroidStudio] 인터넷 연결하는 법('isConnected()' is deprecated 해결) 본문

Framework/Android

[AndroidStudio] 인터넷 연결하는 법('isConnected()' is deprecated 해결)

PersesTitan(페르) 2023. 7. 31. 21:57

인터넷 연결이 되었는지 확인하는 방법중에 유명한(?) isConnected가 사라진다고 해서 대신 사용하는 방법을 찾았습니다.

deprecated

코드

ConnectivityManager.NetworkCallback를 사용하는 방법을 이용하였는데요.
인터넷이 연결되었을때 onAvailable를 불러오고 인터넷이 끊겼을때 onLost를 불러오는 원리를 이용하여 현재 상태를 저장하는 변수에 저장해두어 가져오는 방법으로 구현하였습니다.

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;

import androidx.annotation.NonNull;

public class InternetCheck extends ConnectivityManager.NetworkCallback {
    private final ConnectivityManager manager;
    private boolean connect = false;

    public InternetCheck(Context context) {
        NetworkRequest request = new NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
                .build();
        this.manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        this.manager.registerNetworkCallback(request, this);
    }

    public void finish() {
        this.manager.unregisterNetworkCallback(this);
    }

    public boolean isConnect() {
        return this.connect;
    }

    @Override
    public void onAvailable(@NonNull Network network) {
        // 네트워크가 연결되었을때
        super.onAvailable(network);
        this.connect = true;
    }

    @Override
    public void onLost(@NonNull Network network) {
        // 연결이 끊어지거나 더 이상 이 요청 또는 콜백을 충족하지 못할 때
        super.onLost(network);
        this.connect = false;
    }
}

저는 생성하자 마자 동작시키기위해서 생성자에 ConnectivityManager를 생성 동시에 registerNetworkCallback를 불어왔는데요. 생성동시에 인터넷 연결을 확인하는 작업을 원하지 않는다면 따로 시작 메소드를 만드셔서 구현하셔도 됩니다. 인터넷 연결 확인이 끝나면 finish를 불러와서 끝내주시면 됩니다.

NetworkRequest에서 추가하는 값을 변경하여 wifi연결되었을때만 동작하게 한다거나 커스텀할 수 있습니다. 제가 구현한 코드는 인터넷이 연결되면 무조건 true가 되는 코드 입니다.

사용예시

(...)
InternetCheck internetCheck = new InternetCheck(this);
if (internetCheck.isConnect()) {
    // 인터넷 연결되었을때 동작
} else {
    // 인터넷 연결이 되어있지 않을때 동작
}
// 인터넷 확인 끝냈을때
internetCheck.finish();
(...)

추가 팁

보통 Android에서 더욱 인터넷을 사용하는 코드는 멀티쓰레드 환경이다보니 일반 변수에 넣기보다는 저는 AtomicBoolean를 사용하여 값을 가져오는 것을 추천드립니다.