Android-də fəaliyyətlər arasında böyük məlumat miqdarını, məsələn, şəkil, düzgün şəkildə necə ötürmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Böyük həcmdə məlumatların, məsələn, şəkil kimi, birbaşa Intent vasitəsilə ötürülməsi tövsiyə edilmir, çünki serializasiya zamanı ötürülən məlumatların ölçüsü məhdudlaşdırılır (adətən bir neçə yüz kilobayt və ya megabayt). Çox böyük məlumatların ötürülməsi TransactionTooLargeException-a səbəb ola bilər.
Düzgün yanaşmalar:
-
Məlumatları faylda saxlayın və fayla olan yolu
Intent-də ötürün.- Şəkili müvəqqəti faylda saxlayın.
- Fayla URI və ya yolunu
Extra-da ötürün. - Qəbul edən fəaliyyət alınan yoldan faylı oxuyur.
// Birinci fəaliyyətdə saxlanılması val imageUri: Uri = saveImageToFile(bitmap) // Bitmap-i fayla saxlamaq və Uri qaytarmaq funksiyası val intent = Intent(this, SecondActivity::class.java) intent.putExtra("image_uri", imageUri.toString()) startActivity(intent) // İkinci fəaliyyətdə oxuma val imageUriString = intent.getStringExtra("image_uri") if (imageUriString != null) { val imageUri = Uri.parse(imageUriString) val bitmap = loadImageFromFile(imageUri) // Uri-dən Bitmap yükləmək funksiyası imageView.setImageBitmap(bitmap) } -
Singleton və ya qlobal məlumat saxlama istifadə edin.
- Məlumatları Singleton obyektində və ya tətbiqin hər yerindən əlçatan olan başqa bir sinifdə saxlayın.
- Məlumatları aktivliklər arasında ötürməyə ehtiyac yoxdur, sadəcə Singleton-a müraciət edin.
// Qlobal obyekt, məsələn, Application sinifində və ya ayrıca singleton-də object DataHolder { var bitmap: Bitmap? = null } // Birinci fəaliyyətdə DataHolder.bitmap = bitmap // İkinci fəaliyyətdə val bitmap = DataHolder.bitmap imageView.setImageBitmap(bitmap) DataHolder.bitmap = null // İstifadədən sonra təmizləmə, lazım olarsaTətbiqin həyat dövrünü və fəaliyyətin yenidən yaradılmasını nəzərə alın.
-
Veritabanı (Room) və ya məlumat saxlama istifadə edin (məsələn, SharedPreferences, lakin şəkillər üçün ideal deyil).
- Şəkili (mümkün olsa, byte-array kimi) verilənlər bazasında saxlayın.
- Verilənlər bazasında qeydiyyat identifikatorunu
Intentvasitəsilə ötürün. - Qəbul edən fəaliyyət verilən identifikator ilə verilənlər bazasından şəkili oxuyur.
// Birinci fəaliyyətdə saxlanılması (pseudo-kod Room üçün) val imageEntity = ImageEntity(imageData = bitmapToByteArray(bitmap)) val imageId = imageDatabase.imageDao().insertImage(imageEntity) val intent = Intent(this, SecondActivity::class.java) intent.putExtra("image_id", imageId) startActivity(intent) // İkinci fəaliyyətdə oxuma (pseudo-kod Room üçün) val imageId = intent.getLongExtra("image_id", -1) if (imageId != -1L) { val imageEntity = imageDatabase.imageDao().getImageById(imageId) if (imageEntity != null) { val bitmap = byteArrayToBitmap(imageEntity.imageData) imageView.setImageBitmap(bitmap) } } -
Navigation Component-də Shared ViewModel istifadə edin.
- Əgər Navigation Component istifadə olunursa, ümumi
ViewModelistifadə etmək olar, bu da naviqasiya qrafiki və ya aktivlik ilə əlaqələndirilir. - Məlumatlar bir aktivlikdə yerləşdirilir və digər aktivlikdə əlçatan olur.
// ViewModel-də class SharedViewModel : ViewModel() { val imageBitmap = MutableLiveData<Bitmap>() } // Birinci aktivlikdə (Navigation Component istifadə edilirsə) private val sharedViewModel: SharedViewModel by activityViewModels() // və ya by navGraphViewModels(R.id.nav_graph) sharedViewModel.imageBitmap.value = bitmap // İkinci aktivlikdə private val sharedViewModel: SharedViewModel by activityViewModels() // və ya by navGraphViewModels(R.id.nav_graph) sharedViewModel.imageBitmap.observe(viewLifecycleOwner) { bitmap -> if (bitmap != null) { imageView.setImageBitmap(bitmap) } } - Əgər Navigation Component istifadə olunursa, ümumi
Yöntem seçimi istifadə ssenarisindən, məlumatların ölçüsündən və tətbiqin mürəkkəbliyindən asılıdır. Şəkillər üçün fayla saxlama (və URI ötürmə) və ya Singleton/ViewModel istifadə etmək ən çox tövsiyə olunan və effektiv həllərdir.