Ağa bağlanma

Uygulamanızda ağ işlemleri gerçekleştirmek için manifest dosyanız şunları içermelidir: aşağıdaki izinler:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Güvenli ağ iletişimi için en iyi uygulamalar

Uygulamanıza ağ iletişimi işlevi eklemeden önce bir veri ve bilgi kaynağı üzerinden veri aktarırken, uygulamanızdaki verilerin ve bilgilerin ağ. Bunu yapmak için ağ güvenliğiyle ilgili aşağıdaki en iyi uygulamaları izleyin:

Güvenli ağ iletişimi ilkelerinin nasıl uygulanacağı hakkında daha fazla bilgi için ağ iletişimi güvenlik ipuçları ile ilgili daha fazla bilgi edinin.

HTTP istemcisi seçin

Ağa bağlı uygulamaların çoğu, veri göndermek ve almak için HTTP kullanır. Android platform, HttpsURLConnection müşterisi, TLS, akış yükleme ve indirmeleri, yapılandırılabilir zaman aşımları ve IPv6 ve bağlantı havuzu oluşturma.

Ağ iletişimi işlemleri için daha üst düzey API'ler sunan üçüncü taraf kitaplıklar kullanılabilir. Bunlar, istek gövdelerinin serileştirilmesi ve yanıt gövdelerinin seri durumdan çıkarılması.

  • Retrofit: Tür açısından güvenli bir HTTP Gemini için, OkHttp'nin üzerine inşa edilmiş Square'den JVM'nin müşterisidir. Güçlendirme şunları sağlar: bildirerek bir istemci arayüzü oluşturabilir ve serileştirme kitaplığıdır.
  • Ktor: JetBrains'in HTTP istemcisi, tamamen Kotlin için geliştirildi ve eş yordamlarla destekleniyor. Ktor çeşitli motorları destekler, serileştiriciler ve platformlar.

DNS sorgularını çözümleme

Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda yerleşik destek bulunur: ve DNS-over-TLS modu üzerinden özel DNS aramaları yapılmasını sağlar. DnsResolver API, genel, SRV, NAPTR ve diğerlerini aramanızı sağlayan eşzamansız çözünürlük kayıt türleri. Yanıtın ayrıştırılması, gerçekleştirilecek uygulamaya bırakılır.

Android 9 (API düzeyi 28) ve önceki sürümleri çalıştıran cihazlarda platform DNS'si çözümleyici yalnızca A ve AAAA kayıtlarını destekler. Bu, IP adresini aramanıza bir adla ilişkili olan ancak başka hiçbir kayıt türünü desteklemeyen adresler

NDK tabanlı uygulamalar için bkz. android_res_nsend.

Ağ işlemlerini bir depo ile kapsülleme

Ağ işlemleri gerçekleştirme sürecini basitleştirmek ve kod sayısını azaltmak için uygulamanızın çeşitli bölümlerinde kopya kullanırken kod deposu tasarımını desen. Depo, veri işlemlerini gerçekleştiren ve bazı veriler veya kaynaklar üzerinde net API soyutlaması sağlar.

Retrofit özelliğini kullanarak HTTP yöntemini, Aşağıdaki gibi ağ işlemleri için URL, bağımsız değişkenler ve yanıt türü örnek:

Kotlin

interface UserService {
    @GET("/users/{id}")
    suspend fun getUser(@Path("id") id: String): User
}

Java

public interface UserService {
    @GET("/user/{id}")
    Call<User> getUserById(@Path("id") String id);
}

Depo sınıfı içindeki işlevler, ağ işlemlerini ve bu işlemleri ve sonuçlarını gösterir. Bu kapsülleme, çağrı yapan bileşenlerin deponun verilerin nasıl saklandığını bilmesine gerek yoktur. Gelecekteki verilerin nasıl depolandığı da depo sınıfından izole edilir. Örneğin, Örneğin, API uç noktalarında güncelleme gibi uzaktan bir değişikliğiniz olabilir veya yerel önbelleğe almayı uygulayabilirsiniz.

Kotlin

class UserRepository constructor(
    private val userService: UserService
) {
    suspend fun getUserById(id: String): User {
        return userService.getUser(id)
    }
}

Java

class UserRepository {
    private UserService userService;

    public UserRepository(
            UserService userService
    ) {
        this.userService = userService;
    }

    public Call<User> getUserById(String id) {
        return userService.getUser(id);
    }
}

Yanıt vermeyen kullanıcı arayüzü oluşturmaktan kaçınmak için iş parçacığı. Android varsayılan olarak iş parçacığı (ör. ana kullanıcı arayüzü iş parçacığı) değil. Ağ işlemleri gerçekleştirmeye çalışırsanız ana ileti dizisinde, NetworkOnMainThreadException atılır.

Önceki kod örneğinde, ağ işlemi tetiklenmez. UserRepository çağıran ileti dizisi işlemini eş yordamlar veya enqueue() kullanarak uygulamalıdır işlevini kullanın. Daha fazla bilgi için codelab'e bakın. internet, başlıklı makalemize göz atın.

Yapılandırma değişikliklerinden kurtulma

Ekran döndürme gibi bir yapılandırma değişikliği gerçekleştiğinde, etkinlik kaldırılır ve yeniden oluşturulur. Örnekte kaydedilmemiş olan tüm veriler küçük miktarda veri barındırabilen parça etkinliğinizin durumunu gösterir, kayboldu. Bu durumda, ağ isteklerinizi tekrar göndermeniz gerekebilir.

Aşağıdakileri yapmak için ViewModel kullanabilirsiniz: yapılandırma değişikliklerinden ViewModel bileşeni Kullanıcı arayüzüyle ilgili verileri yaşam döngüsüne duyarlı bir şekilde depolayıp yönetmek için sağlar. Önceki UserRepository kullanıldığında ViewModel şunları yapabilir: ve sonucu parçanıza veya etkinliğinize sağlayın LiveData kullanarak:

Kotlin

class MainViewModel constructor(
    savedStateHandle: SavedStateHandle,
    userRepository: UserRepository
) : ViewModel() {
    private val userId: String = savedStateHandle["uid"] ?:
        throw IllegalArgumentException("Missing user ID")

    private val _user = MutableLiveData<User>()
    val user = _user as LiveData<User>

    init {
        viewModelScope.launch {
            try {
                // Calling the repository is safe as it moves execution off
                // the main thread
                val user = userRepository.getUserById(userId)
                _user.value = user
            } catch (error: Exception) {
                // Show error message to user
            }

        }
    }
}

Java

class MainViewModel extends ViewModel {

    private final MutableLiveData<User> _user = new MutableLiveData<>();
    LiveData<User> user = (LiveData<User>) _user;

    public MainViewModel(
            SavedStateHandle savedStateHandle,
            UserRepository userRepository
    ) {
        String userId = savedStateHandle.get("uid");
        Call<User> userCall = userRepository.getUserById(userId);
        userCall.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                if (response.isSuccessful()) {
                    _user.setValue(response.body());
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                // Show error message to user
            }
        });
    }
}

Bu konuyla ilgili daha fazla bilgi edinmek için aşağıdaki ilgili kılavuzlara göz atın: