หากต้องการดำเนินการเครือข่ายในแอปพลิเคชันของคุณ ไฟล์ Manifest ของคุณต้องมี สิทธิ์ต่อไปนี้
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
แนวทางปฏิบัติแนะนำสำหรับการสื่อสารของเครือข่ายที่ปลอดภัย
ก่อนเพิ่มฟังก์ชันเครือข่ายลงในแอป คุณต้องตรวจสอบว่า ข้อมูลภายในแอปของคุณจะปลอดภัยอยู่เสมอเมื่อคุณส่งข้อมูล เครือข่าย ในการดำเนินการนี้ ให้ทำตามแนวทางปฏิบัติแนะนำด้านความปลอดภัยของเครือข่ายต่อไปนี้
- ลดปริมาณข้อมูลผู้ใช้ที่ละเอียดอ่อนหรือเป็นส่วนตัวซึ่งคุณส่งผ่านเครือข่าย
- ส่งการจราจรของข้อมูลในเครือข่ายทั้งหมดจากแอปผ่าน SSL
- ลองสร้างความปลอดภัยของเครือข่าย การกำหนดค่า ซึ่งช่วยให้แอปของคุณ เชื่อถือผู้ออกใบรับรองที่กำหนดเอง (CA) หรือจำกัดชุด CA ของระบบ ที่วางใจให้สามารถสื่อสารได้อย่างปลอดภัย
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้หลักการเครือข่ายที่ปลอดภัย โปรดดูที่ เคล็ดลับความปลอดภัยเกี่ยวกับเครือข่าย
เลือกไคลเอ็นต์ HTTP
แอปที่เชื่อมต่อกับเครือข่ายส่วนใหญ่จะใช้ HTTP เพื่อส่งและรับข้อมูล Android
จะมี
HttpsURLConnection
ซึ่งรองรับ TLS, การอัปโหลดและการดาวน์โหลดสตรีมมิง, การหมดเวลาที่กำหนดค่าได้
IPv6 และการรวมการเชื่อมต่อ
นอกจากนี้ คุณยังใช้ไลบรารีของบุคคลที่สามที่มี API ระดับสูงขึ้นสําหรับการดำเนินการของเครือข่ายได้ด้วย ซึ่งรองรับฟีเจอร์อำนวยความสะดวกต่างๆ เช่น การเรียงอันดับเนื้อหาคำขอและการดีซีเรียลไลซ์เนื้อความของการตอบสนอง
- อุปกรณ์เสริม: HTTP ที่ปลอดภัยตามประเภท ซึ่งเป็นลูกค้าของ JVM จาก Square ซึ่งสร้างโดย OkHttp Retrofit ช่วยให้คุณ สร้างอินเทอร์เฟซไคลเอ็นต์อย่างชัดเจน และรองรับ ไลบรารีการเรียงอันดับ
- Ktor: ไคลเอ็นต์ HTTP จาก JetBrains สำหรับ Kotlin และขับเคลื่อนโดยโครูทีน Ktor รองรับเครื่องมือที่หลากหลาย ตัวทำให้ซีเรียลไลเซอร์ และแพลตฟอร์ม
แก้ปัญหาคำขอ DNS
อุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) ขึ้นไปมีการรองรับในตัวสำหรับ
การค้นหา DNS เฉพาะทางผ่านทั้งการค้นหาเคลียร์ข้อความและโหมด DNS-over-TLS
DnsResolver
API ให้ความละเอียดแบบทั่วไปแบบไม่พร้อมกัน ซึ่งช่วยให้คุณค้นหา SRV
, NAPTR
และประเภทระเบียนอื่นๆ ได้ การสํารวจคําตอบจะขึ้นอยู่กับแอป
สำหรับอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) และต่ำกว่า จะใช้ DNS ของแพลตฟอร์ม
รีโซลเวอร์รองรับระเบียน A
และ AAAA
เท่านั้น วิธีนี้ทำให้คุณค้นหา IP
อีเมลที่เชื่อมโยงกับชื่อ แต่ไม่รองรับระเบียนประเภทอื่นๆ
สำหรับแอปที่ใช้ NDK โปรดดู
android_res_nsend
ห่อหุ้มการดำเนินการของเครือข่ายด้วยที่เก็บ
เพื่อลดความซับซ้อนของขั้นตอนการดำเนินการของเครือข่ายและลดโค้ด การทำซ้ำในส่วนต่างๆ ของแอป คุณจะสามารถใช้การออกแบบที่เก็บ รูปแบบ รีพอสิทอรี่คือคลาสที่จัดการการดำเนินการกับข้อมูลและให้ข้อมูลสรุป API ที่ชัดเจนสำหรับข้อมูลหรือทรัพยากรที่เฉพาะเจาะจง
คุณสามารถใช้ Retrofit เพื่อประกาศอินเทอร์เฟซที่ระบุเมธอด HTTP, URL, อาร์กิวเมนต์ และประเภทการตอบกลับสําหรับการดําเนินการของเครือข่าย ดังตัวอย่างต่อไปนี้
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); }
ภายในคลาสที่เก็บ ฟังก์ชันสามารถสรุปการดำเนินการของเครือข่ายและ ให้คนเห็นผลลัพธ์ การห่อหุ้มข้อมูลนี้จะช่วยให้แน่ใจว่าคอมโพเนนต์ที่เรียก ของที่เก็บไม่จำเป็นต้องทราบวิธีเก็บข้อมูล การเปลี่ยนแปลงในอนาคตกับ วิธีจัดเก็บข้อมูลที่แยกไปยังคลาสที่เก็บด้วย สำหรับ ตัวอย่างเช่น คุณอาจมีการเปลี่ยนแปลงจากระยะไกล เช่น การอัปเดตปลายทาง API หรือ คุณอาจต้องใช้การแคชในเครื่อง
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); } }
เพื่อหลีกเลี่ยงการสร้าง UI ที่ไม่ตอบสนอง โปรดอย่าดำเนินการของเครือข่ายใน
เทรดหลัก โดยค่าเริ่มต้น Android จะกำหนดให้คุณดำเนินการเกี่ยวกับเครือข่ายในเทรดอื่นที่ไม่ใช่เทรด UI หลัก ถ้าคุณพยายามทำการดำเนินการของเครือข่าย
ในเทรดหลัก
NetworkOnMainThreadException
ได้
ในตัวอย่างโค้ดก่อนหน้านี้
ไม่ได้เรียกใช้การดำเนินการของเครือข่าย ผู้โทรของ UserRepository
ต้องใช้การแยกชุดข้อความโดยใช้โครูทีนหรือใช้enqueue()
สำหรับข้อมูลเพิ่มเติม โปรดดู Codelab รับข้อมูลจาก
อินเทอร์เน็ต
ซึ่งสาธิตวิธีใช้การจัดชุดข้อความโดยใช้โครูทีน Kotlin
การดำเนินการเปลี่ยนแปลงการกำหนดค่า
เมื่อเกิดการเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนหน้าจอ แฟรกเมนต์หรือ กิจกรรมจะถูกทำลายและสร้างขึ้นใหม่ ข้อมูลที่ไม่ได้บันทึกไว้ในอินสแตนซ์ สำหรับกิจกรรมส่วนย่อย ซึ่งสามารถเก็บข้อมูลได้เพียงเล็กน้อย สูญหายไป หากเกิดเหตุการณ์นี้ขึ้น คุณอาจต้องส่งคำขอเครือข่ายอีกครั้ง
คุณสามารถใช้ ViewModel
เพื่ออนุญาตให้
การเปลี่ยนแปลงการกำหนดค่าข้อมูลของคุณ คอมโพเนนต์ ViewModel
คือ
ออกแบบมาเพื่อจัดเก็บและจัดการข้อมูลที่เกี่ยวข้องกับ UI ตามวงจร
ด้วยการใช้ UserRepository
ก่อนหน้า ViewModel
สามารถทำให้ฟังก์ชัน
คำขอเครือข่ายที่จำเป็นและแสดงผลลัพธ์ไปยังส่วนย่อยหรือกิจกรรมของคุณ
โดยใช้ LiveData
:
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 } }); } }
อ่านคู่มือที่เกี่ยวข้อง
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ โปรดดูคำแนะนำที่เกี่ยวข้องต่อไปนี้
- ลดการใช้แบตเตอรี่ของเครือข่าย: ภาพรวม
- ลดผลกระทบของการอัปเดตเป็นประจำ
- เนื้อหาบนเว็บ
- พื้นฐานของแอปพลิเคชัน
- คู่มือสถาปัตยกรรมแอป