Analytics adalah bagian integral dari aplikasi seluler modern. Analytics memungkinkan Anda mengumpulkan informasi tentang pengguna untuk mengembangkan dan meningkatkan produk.
Seringkali, mengumpulkan informasi mengurangi kinerja aplikasi. Proses ini juga memuat CPU dan memori, dan ini adalah harga tinggi. Pengoperasian aplikasi yang lambat dapat menyebabkan ulasan pengguna negatif, menurunkan peringkat, dan menyebabkan hilangnya audiensi.
Tim pengembang Android kami menghadapi masalah ini saat mengerjakan proyek berikutnya, yang terkait dengan berita tersebut. Kami harus mendaftarkan tampilan setiap berita dalam daftar.
Percobaan nomor 1
Setelah menerima tugas untuk mengumpulkan analitik, tim dengan cepat menunjukkan hasilnya. Pemicu untuk menghasilkan suatu acara adalah metode
onViewAttachedToWindow . Semuanya tampak baik-baik saja, tetapi dengan pengguliran cepat, antarmuka terasa menggantung - ada sesuatu yang salah. Masalahnya harus dipecahkan.
Semua orang merasakan penangguhan secara berbeda, jadi kami membutuhkan fakta dan bukti. Untuk mengukur lag, FPS (Frames Per Second) dipilih, dan
TinyDenser FPS-meter untuk mengukur
lag . Setelah menghubungkan utilitas, tim menerima konfirmasi obyektif dari masalah - indikator turun, kadang-kadang cukup mencolok: kurang dari 30 frame per detik, perekaman layar dengan utilitas yang dihidupkan ditunjukkan pada Gambar 1.
Gambar 1. Perekaman layar sebelum optimasiPercobaan nomor 2
Dan jika Anda menunda pengiriman acara hingga pengguna menggulir daftar? Hmmm, tim berpikir, dan memutuskan untuk membuat antrian acara dan mengirimkannya setelah gulir berhenti. Semuanya sederhana di sini: kami menambahkan
OnScrollListener ke
RecyclerView dan menunggu hingga
NewState datar
SCROLL_STATE_IDLE - masalahnya sebagian diselesaikan.
class IdleStateScrollListener(private val analyticsFacade: AnalyticsFacade) : RecyclerView.OnScrollListener() { fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { analyticsFacade.setPending(newState != RecyclerView.SCROLL_STATE_IDLE) } }
Langkah selanjutnya adalah menerapkan akumulasi acara dan pengirimannya.
Untuk mengelola antrian, kami membuat kelas yang bertanggung jawab untuk menambahkan acara ke antrian dan mengirim analitik ke layanan. Untuk pengiriman berkala, kami memilih
ScheduledExecutorService dengan satu utas yang menjalankan
Runnable setiap detik, waktu dipilih secara empiris.
Ini segera membuahkan hasil, peningkatan yang signifikan dalam FPS. Pada prinsipnya, masalah terpecahkan, pada Gambar 2 kita melihat hasil aplikasi setelah upaya kedua. Tetapi hanya ada satu tugas yang tersisa - acara dikirim ke layanan, yang menyebabkan seringnya generasi objek kelas
Intent , dan ini juga membebani
GC dan memberikan "fasilitas" dalam bentuk jeda
stop-the-world .
Gambar 2. Perekaman layar setelah upaya keduaPercobaan nomor 3
โMengirim bukan satu acara pada satu waktu, tetapi daftar acara adalah ide bagus lainnya,โ pikir tim. Setelah penyempurnaan kelas yang singkat, tim mengimplementasikan pengiriman acara dengan daftar dan menerima nilai stabil indikator pada level 55-60 frame per detik (Gambar 3).
Gambar 3. Perekaman layar setelah upaya ketigaKesimpulan
Tugas sepele mengumpulkan analitik berubah menjadi proses yang menarik dan informatif, di mana tim memompa keterampilannya dalam meneliti masalah kinerja aplikasi dan menemukan cara untuk menyelesaikannya. Saya harap pengalaman kami bermanfaat bagi pemula dan pengembang berpengalaman.
Bisakah hal lain dilakukan?
Tim kami menentukan pilihan ketiga, tetapi ini bukan satu-satunya hal yang bisa diterapkan.
Dalam implementasi saat ini, ketika metode
onViewAttachedToWindow dipicu,
berita diubah menjadi objek acara analitik, dan karenanya, objek baru dibuat. Salah satu solusi yang mungkin adalah dengan menunda konversi sampai saat pengiriman: untuk mengakumulasi dalam antrian bukan peristiwa, tetapi daftar elemen itu sendiri. Maka konversi akan terjadi ketika gulir dalam mode
SCROLL_STATE_IDLE . Anda juga bisa membuat kumpulan objek untuk acara. Bersama-sama, tindakan ini dapat memberikan peningkatan tambahan dalam kinerja aplikasi.