OutOfMemory dan penggunaan gambar vektor di Android Studio

Halo, Habr! Dalam artikel ini, yang ditujukan untuk pemula, saya ingin memberikan beberapa kiat untuk mengoptimalkan penggunaan memori perangkat oleh aplikasi, agar tidak terus-menerus mendapatkan OutOfMemory, dan juga mempertimbangkan penggunaan gambar vektor dalam versi Android Studio (3.4) saat ini, karena sebagian besar sumber daya berbahasa Rusia tentang ini Topik ( artikel terakhir tentang Habré tentang gambar-gambar vektor berasal dari tahun 2015) sudah usang, yang sering menyesatkan pengembang pemula. Jadi mari kita mulai.

1. Gunakan gambar vektor alih-alih bitmap


Tentu saja, gambar besar dengan banyak detail kecil tidak boleh diubah menjadi vektor - ini akan memakan ruang sebanyak raster, jika tidak lebih. Namun, gambar kecil, seperti ikon dan detail lain dari antarmuka pengguna harus dikonversi ke vektor untuk menghemat memori. Dan bekerja dengan gambar vektor seringkali jauh lebih nyaman. Dan sekarang, hal terpenting - bagaimana melakukannya?

  1. Buka Android Studio.
  2. Klik kanan pada folder yang dapat digambar atau kontennya> Baru> Aset Vektor

  3. Tentukan path ke file svg Anda. Jika gambar Anda memiliki bentuk tidak beraturan, maka saya sarankan Anda untuk mencentang kotak di sebelah parameter Override - jika tidak gambar akan disesuaikan dengan ukuran standar, yang dapat mengubah proporsinya.

  4. Berikutnya> Selesai
  5. Selesai!

Untuk mengkonversi dari raster ke vektor, saya dapat merekomendasikan aplikasi Inkscape gratis yang sangat baik. Sedikit tentang bekerja dengannya:

  1. Buka Inkscape.
  2. Seret setiap raster ke dalamnya. Di jendela yang terbuka, pilih opsi impor dan klik OK.
  3. Di bilah alat atas, setelah memilih gambar kami, pilih Path> Vectorize raster (Shift + Alt + B).
  4. Sekarang yang paling penting. Di jendela baru, centang kotak di samping "Hapus latar belakang" dan pilih yang berikut: apakah gambar kita akan berwarna, dan berapa banyak pemindaian yang akan dibuat. Kita tidak boleh lupa bahwa ukuran file vektor kita secara langsung tergantung pada dua parameter ini.

    Lebih banyak pindaian - lebih banyak warna, corak, dan detail. Leprechaun saya, untuk memperoleh penampilan yang ilahi, karena lebih banyak warna dalam gambar, diperlukan 30 pemindaian. Ini cukup banyak, lebih baik melakukan tidak lebih dari sepuluh dan memilih gambar lebih mudah.

  5. Tutup jendela, klik raster dan hapus dengan tombol Delete, buka File> Document Properties (Shift + Ctrl + D), sesuaikan ukuran halaman untuk konten.

Sekarang kita akan melakukan tes kecil yang membuktikan keunggulan vektor dalam menghemat memori.
Saya membuat proyek baru dengan ImageView tunggal, di mana saya menerapkan animasi yang memindahkannya dari titik A ke titik B, secara bergantian mengubah gambar menjadi raster dan vektor. Kami melihat data.

Raster



Vektor



Perbedaannya hampir dua kali. Saya pikir ini cukup meyakinkan.

2. Tambah ukuran tumpukan


Untuk melakukan ini, buka manifes proyek Anda (aplikasi> manifes> AndroidManifest.xml) dan tambahkan baris di kolom aplikasi:

android:largeHeap="true" 

Sebenarnya, meningkatkan tumpukan bukanlah solusi untuk masalah OutOfMemory, tetapi lebih mendorongnya ke rak jauh. Alih-alih mengoptimalkan penggunaan memori perangkat oleh aplikasi, kami memberikan lebih banyak ruang. Jangan lupa bahwa setiap perangkat memiliki kapasitas memori masing-masing, baik primer maupun sekunder, yang dialokasikan untuk aplikasi tersebut.

3. Hindari kebocoran memori


Setiap aplikasi dalam pekerjaannya menggunakan banyak objek, yang, tentu saja, menempati tempat tertentu dalam memori. Idealnya, pengumpul sampah harus menghapus objek yang tidak terpakai darinya, tetapi kadang-kadang ada yang disebut "kebocoran memori" yang menyebabkan masalah serius dalam aplikasi. Ada berbagai penyebab kebocoran memori, yang dijelaskan secara rinci di sini .

Saya sendiri, saya ingin menyarankan perpustakaan WeakHandler , yang dikembangkan oleh Badoo, dan dirancang untuk menghilangkan kebocoran memori yang terkait dengan penyalahgunaan android.os.Handler. Untuk menggunakan perpustakaan ini, tambahkan baris berikut ke kolom dependensi Anda di file gradle Anda (Skrip Gradle> build.gradle (Module: app)):

 compile 'com.badoo.mobile:android-weak-handler:1.1' 

dan di file java:

 private WeakHandler mHandler; protected void onCreate(Bundle savedInstanceState) { mHandler = new WeakHandler(); ... } private void onClick(View view) { mHandler.postDelayed(new Runnable() { view.setVisibility(View.INVISIBLE); }, 5000); } 

Dan jangan lupa untuk mengimpor WeakHandler sendiri jika studio tidak melakukan ini secara otomatis.

4. Hindari animasi selang waktu yang besar


Animasi frame-by-frame di Android Studio adalah hal yang nyaman, tetapi bukan yang paling ekonomis. Jika Anda menggunakan sejumlah besar gambar di dalamnya, Anda pasti akan mendapatkan OutOfMemory.

Tapi, jika Anda benar-benar membutuhkannya, lebih baik menggunakan gambar gif bersama dengan pustaka Gif Drawable Android . Pustaka ini menyederhanakan pekerjaan dengan gif dan juga menggunakan memori jauh lebih sedikit daripada animasi frame-by-frame Android Studio. Untuk menggunakan perpustakaan ini, tambahkan baris berikut ke kolom dependensi Anda di file gradle Anda (Skrip Gradle> build.gradle (Module: app)):

 implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' 

dan di file gradle kedua Anda (Skrip Gradle> build.gradle (Modul: "nama aplikasi Anda")) di skrip builds dan semua kolom proyek baris:

 mavenCentral() 

dan di file java:

 GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start(); 

Untuk menonaktifkan gif, alih-alih mulai (), tulis stop (). Juga jangan lupa kompres gif, ini akan menghemat lebih banyak ruang.

Saya harap artikel saya bermanfaat bagi Anda. Terima kasih

Source: https://habr.com/ru/post/id450566/


All Articles