Androidда активтистер арасында чоң көлөмдөгү маалыматтарды, мисалы сүрөттү туура өткөрүү жолдору кандай?
sobes.tech AI
AIден жооп
Үлкен көлемдүү маалыматтарды, мисалы сүрөттөрдү, түз эле Intent аркылуу өткөрүү сунушталбайт, анткени сериализация учурунда өткөрүлүүчү маалыматтын өлчөмүнө чектөө коюлган (адатта бир нече жүз килобайт же мегабайт). Өтө чоң маалыматтарды өткөрүү TransactionTooLargeException катага алып келиши мүмкүн.
Туура ыкмалар:
-
Маалыматты файлга сактоо жана файлдын жолун
Intentаркылуу берүү:- Сүрөттү убактылуу файлга сактоо.
- URI же файл жолун
Extraаркылуу берүү. - Кабыл алуучу активность файлды көрсөтүлгөн жолдон окуйт.
// Биринчи активдеги сактоо val imageUri: Uri = saveImageToFile(bitmap) // Bitmapти файлга сактап, URI кайтаруучу функция val intent = Intent(this, SecondActivity::class.java) intent.putExtra("image_uri", imageUri.toString()) startActivity(intent) // Экинчи активдеги окуу val imageUriString = intent.getStringExtra("image_uri") if (imageUriString != null) { val imageUri = Uri.parse(imageUriString) val bitmap = loadImageFromFile(imageUri) // Bitmapти URI аркылуу жүктөө функциясы imageView.setImageBitmap(bitmap) } -
Singleton же глобалдык маалымат сактагычты колдонуу:
- Маалыматты Singleton объектисине же башка класска сактоо, ал бардык бөлүмдөрдөн жеткиликтүү.
- Активациялар арасы өткөрүү үчүн эч нерсе берүү керек эмес, жөн гана Singleton аркылуу маалымат алуу.
// Жалпы объект, мисалы, Application класста же өзүнчө singleton object DataHolder { var bitmap: Bitmap? = null } // Биринчи активдеги DataHolder.bitmap = bitmap // Экинчи активдеги val bitmap = DataHolder.bitmap imageView.setImageBitmap(bitmap) DataHolder.bitmap = null // Колдонгондон кийин тазалоо, керек болсоӨмүр цикли жана активдүүлүк эске алынууга тийиш, анткени ал кайра түзүлүшү мүмкүн.
-
Маалыматты базада сактоо (Room) же башка сактагычты колдонуу (мисалы, SharedPreferences, бирок сүрөттөр үчүн идеалдуу эмес):
- Сүрөттү (мисалы, байт массиви түрүндө) базада сактоо.
- Базадагы жазуунун идентификаторун
Intentаркылуу берүү. - Кабыл алуучу активность базадан сүрөттү идентификатор аркылуу окуйт.
// Биринчи активдеги сактоо (pseudo-код Room үчүн) 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) // Экинчи активдеги окуу (pseudo-код Room үчүн) 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 компонентинде Shared ViewModel колдонуу:
- Эгер навигация компоненти колдонулса, жалпы
ViewModelколдонсо болот, ал графга же активдүүлүккө байланыштуу. - Маалыматтар
ViewModelичинде сакталат жана башка активдүүлүктөн жеткиликтүү.
// ViewModel ичинде class SharedViewModel : ViewModel() { val imageBitmap = MutableLiveData<Bitmap>() } // Биринчи активдеги (Navigation компонентинде) private val sharedViewModel: SharedViewModel by activityViewModels() // же by navGraphViewModels(R.id.nav_graph) sharedViewModel.imageBitmap.value = bitmap // Экинчи активдеги private val sharedViewModel: SharedViewModel by activityViewModels() // же by navGraphViewModels(R.id.nav_graph) sharedViewModel.imageBitmap.observe(viewLifecycleOwner) { bitmap -> if (bitmap != null) { imageView.setImageBitmap(bitmap) } } - Эгер навигация компоненти колдонулса, жалпы
Тандоо колдонуу сценарийине, маалыматтын көлөмүнө жана колдонмонун татаалдыгына жараша болот. Сүрөттөр үчүн файлда сактоо (URI өткөрүү) же Singleton/ViewModel колдонуу эң ылайыктуу жана эффективдүү чечимдер болуп саналат.