Saya mencoba bekerja mengirim objek kelas pelanggan saya dari satu Activity
dan menampilkannya di yang lain Activity
.
Kode untuk kelas pelanggan:
public class Customer {
private String firstName, lastName, Address;
int Age;
public Customer(String fname, String lname, int age, String address) {
firstName = fname;
lastName = lname;
Age = age;
Address = address;
}
public String printValues() {
String data = null;
data = "First Name :" + firstName + " Last Name :" + lastName
+ " Age : " + Age + " Address : " + Address;
return data;
}
}
Saya ingin mengirim objeknya dari satu Activity
ke yang lain dan kemudian menampilkan data di sisi lain Activity
.
Bagaimana saya bisa mencapainya?
Jawaban:
Salah satu opsi bisa membiarkan kelas kustom Anda mengimplementasikan
Serializable
antarmuka dan kemudian Anda bisa melewatkan instance objek dalam maksud tambahan menggunakanputExtra(Serializable..)
varianIntent#putExtra()
metode.Kodesemu :
Catatan: Pastikan setiap kelas bersarang dari kelas khusus utama Anda telah mengimplementasikan antarmuka Serializable untuk menghindari pengecualian serialisasi. Sebagai contoh:
sumber
Parcelable
IS dirancang khusus untuk tujuan itu (dan jauh lebih cepat daripadaSerializable
). Saya bingung.Parcelable
mungkin bagus untuk kecepatan, tetapi rumit untuk diterapkan. Bagaimana jika Anda memiliki 8 objek yang harus Anda lewati di antara aktivitas, apakah Anda akan membuat masing-masingParcelable
? Akan lebih masuk akal untuk digunakanSerializable
sebagai gantinya. Ketika Anda menerapkanParcelable
Anda harus menambahkan banyak kode ke kelas, dan memesan bidang dengan cara yang sangat spesifik;Serializable
kamu tidak. Pada akhirnya, saya pikir itu tergantung pada berapa banyak objek yang Anda lewati dan apa yang Anda coba lakukan.Serializable
adalah antarmuka Java standar. Anda cukup menandai kelas Serializable dengan mengimplementasikan antarmuka, dan Java akan secara otomatis membuat cerita bersambung dalam situasi tertentu.Parcelable
adalah antarmuka spesifik Android tempat Anda mengimplementasikan sendiri serialisasi itu. Itu diciptakan untuk menjadi jauh lebih efisien daripada Serializable, dan untuk mengatasi beberapa masalah dengan skema serialisasi Java defaultLaksanakan kelas Anda dengan Serializable. Anggaplah ini kelas entitas Anda:
Kami mengirim objek yang dipanggil
dene
dari aktivitas X ke aktivitas Y. Di suatu tempat dalam aktivitas X;Dalam aktivitas Y kita mendapatkan objek.
Itu dia.
sumber
classCastException: java.lang.Long
melakukannya. Bisakah Anda jelaskan mengapa?(Serializable)
ke objek?Anda dapat menghasilkan kode Parcelable untuk kelas Anda menggunakan situs ini .
sumber
Parcelable
maka saya lebih suka menjaga kelas POJO saya Android-agnostik dan digunakanSerializable
.Gunakan gson untuk mengonversi objek Anda ke JSON dan meneruskannya melalui niat. Di Aktivitas baru, konversi JSON ke objek.
Di Anda
build.gradle
, tambahkan ini ke dependensi AndaDi Aktivitas Anda, konversikan objek ke string-json:
Di Aktivitas penerimaan Anda, ubah kembali string json ke objek asli:
Bagi Kotlin itu sama saja
Lulus data
Terima data
sumber
Saat memanggil suatu aktivitas
Di toClass.java menerima aktivitas oleh
Harap pastikan bahwa kelas pelanggan menerapkan paket
sumber
Dalam pengalaman saya ada tiga solusi utama, masing-masing dengan kekurangan dan kelebihannya:
Menerapkan Parcelable
Menerapkan Serializable
Menggunakan semacam perpustakaan bus acara ringan (misalnya, EventBus Greenrobot atau Otto Square)
Parcelable - standar cepat dan Android, tetapi memiliki banyak kode boilerplate dan membutuhkan string kode keras untuk referensi saat menarik nilai keluar dari maksud (tidak diketik dengan kuat).
Serializable - mendekati nol boilerplate, tetapi merupakan pendekatan paling lambat dan juga membutuhkan string yang dikodekan keras saat menarik nilai keluar dari tujuannya (tidak diketik dengan kuat).
Event Bus - zero boilerplate, pendekatan tercepat, dan tidak memerlukan string hard-coded, tetapi membutuhkan dependensi tambahan (walaupun biasanya ringan, ~ 40 KB)
Saya memposting perbandingan yang sangat rinci di sekitar tiga pendekatan ini, termasuk tolok ukur efisiensi.
sumber
Saya menemukan metode sederhana & elegan:
Metode 1
Kode untuk aktivitas pertama:
Kode untuk aktivitas kedua:
Anda akan menemukan
objSent
&objReceived
memiliki yang samahashCode
, sehingga mereka identik.Tapi mengapa kita bisa melewatkan objek java dengan cara ini?
Sebenarnya, pengikat android akan membuat referensi JNI global untuk objek java dan melepaskan referensi JNI global ini ketika tidak ada referensi untuk objek java ini. binder akan menyimpan referensi JNI global ini di objek Binder.
* HATI-HATI: metode ini HANYA berfungsi kecuali dua aktivitas berjalan dalam proses yang sama, jika tidak lempar ClassCastException di (ObjectWrapperForBinder) getIntent (). GetExtras (). GetBinder ("object_value") *
class ObjectWrapperForBinder defination
Metode 2
Tetapi Metode 2 memiliki masalah kecil tapi serius, jika penerima gagal mengembalikan objek java (misalnya, beberapa pengecualian terjadi sebelum mengembalikan objek java, atau Kegiatan penerima tidak ada sama sekali), maka objek java akan menjadi anak yatim atau kehabisan memori, Metode 1 tidak memiliki masalah ini, karena pengikat android akan menangani pengecualian ini
Metode 3
Untuk memohon objek java dari jarak jauh, kami akan membuat kontrak data / antarmuka untuk menggambarkan objek java, kami akan menggunakan file aidl
IDataContract.aidl
Kode untuk aktivitas pertama
Kode untuk aktivitas kedua:
ubah atribut android: process di AndroidManifest.xml menjadi nama proses yang tidak kosong untuk memastikan aktivitas kedua berjalan di proses lain
Dengan cara ini, kita dapat melewati antarmuka antara dua aktivitas meskipun mereka berjalan dalam proses yang berbeda, dan memanggil metode antarmuka dari jarak jauh
Metode 4
Metode 3 tampaknya tidak cukup sederhana karena kita harus mengimplementasikan antarmuka Aidl. Jika Anda hanya ingin melakukan tugas sederhana dan nilai metode pengembalian tidak diperlukan, kita dapat menggunakan android.os.Messenger
Kode untuk aktivitas pertama (pengirim):
Kode untuk aktivitas kedua (penerima):
Semua Messenger.send akan mengeksekusi dalam Handler secara tidak sinkron dan berurutan.
Sebenarnya, android.os.Messenger juga merupakan antarmuka Aidl, jika Anda memiliki kode sumber android, Anda dapat menemukan file bernama IMessenger.aidl
sumber
Anda juga bisa menulis data objek ke String dan int sementara, dan meneruskannya ke aktivitas. Tentu saja dengan cara itu, Anda mendapatkan data yang diangkut, tetapi bukan objek itu sendiri.
Tetapi jika Anda hanya ingin menampilkannya, dan tidak menggunakan objek dalam metode lain atau semacamnya, itu sudah cukup. Saya melakukannya dengan cara yang sama untuk hanya menampilkan data dari satu objek dalam aktivitas lain.
Anda juga bisa memasukkannya langsung bukan ke temp, tetapi cara ini lebih jelas, menurut saya. Selain itu, Anda dapat mengatur ivar temp ke null sehingga mereka dibersihkan oleh GarbageCollector lebih cepat.
Semoga berhasil!
Di samping catatan: override toString () alih-alih menulis metode cetak Anda sendiri.
Seperti disebutkan dalam komentar di bawah, ini adalah cara Anda mendapatkan data Anda kembali di aktivitas lain:
sumber
Bundle extras = getIntent().getExtras();
String val = extras.getString("fname");
Saya membuat kelas pembantu tunggal yang memegang benda-benda sementara.
Alih-alih meletakkan objek Anda di dalam Intent, gunakan IntentHelper:
Di dalam Aktivitas baru Anda, Anda bisa mendapatkan objek:
Ingatlah bahwa setelah dimuat, objek dihapus untuk menghindari referensi yang tidak perlu.
sumber
BookActivity.getInstance().recommendationResponse
diRoomsActivity
obj
menjadinull
. Untuk menghindarinya,obj
sebaiknya disimpan di suatu tempat untuk mendapatkannya kembali. Memang solusi Json menyimpan data objek di Intent.Ada beberapa cara di mana Anda dapat mengakses variabel atau objek di kelas atau Kegiatan lainnya.
A. Basis Data
B. Preferensi bersama.
C. Serialisasi objek.
D. Kelas yang dapat menyimpan data umum dapat dinamai sebagai Common Utilities. Tergantung kamu.
E. Melewati data melalui Intents dan Interface Parcelable.
Itu tergantung pada kebutuhan proyek Anda.
A. Basis Data
SQLite adalah database sumber terbuka yang tertanam ke Android. SQLite mendukung fitur basis data relasional standar seperti sintaks SQL, transaksi, dan pernyataan yang disiapkan.
Tutorial
B. Preferensi bersama
Misalkan Anda ingin menyimpan nama pengguna. Jadi sekarang akan ada dua hal, nama pengguna utama , nilai nilai.
Cara menyimpan
Menggunakan putString (), putBoolean (), putInt (), putFloat (), dan putLong () Anda dapat menyimpan dtatype yang Anda inginkan.
Cara mengambil
http://developer.android.com/reference/android/content/SharedPreferences.html
C. Serialisasi objek
Serlisasi objek digunakan jika kita ingin menyimpan status objek untuk mengirimkannya melalui jaringan atau Anda dapat menggunakannya untuk tujuan Anda juga.
Gunakan kacang Jawa dan simpan di dalamnya sebagai salah satu ladangnya dan gunakan getter dan setter untuk itu.
JavaBeans adalah kelas Java yang memiliki properti. Pikirkan properti sebagai variabel instance pribadi. Karena bersifat pribadi, satu-satunya cara mereka dapat diakses dari luar kelas mereka adalah melalui metode di kelas. Metode yang mengubah nilai properti disebut metode setter, dan metode yang mengambil nilai properti disebut metode pengambil.
Tetapkan variabel dalam metode email Anda dengan menggunakan
Kemudian gunakan serialisasi objek untuk membuat serialisasi objek ini dan di kelas Anda yang lain deserialize objek ini.
Dalam serialisasi objek dapat direpresentasikan sebagai urutan byte yang mencakup data objek serta informasi tentang tipe objek dan tipe data yang disimpan dalam objek.
Setelah objek serial telah ditulis ke dalam file, itu dapat dibaca dari file dan deserialized. Yaitu, tipe informasi dan byte yang mewakili objek dan datanya dapat digunakan untuk membuat ulang objek dalam memori.
Jika Anda ingin tutorial untuk ini lihat:
Serialisasi di Jawa (posting blog)
Dapatkan variabel di kelas lain (Stack Overflow)
D. CommonUtilities
Anda dapat membuat kelas sendiri yang dapat berisi data umum yang sering Anda butuhkan dalam proyek Anda.
Sampel
E. Mengirim data melalui niat
Silakan lihat tutorial Android - Data paket untuk melewati antara Aktivitas menggunakan kelas Parcelable untuk opsi pengiriman data ini.
sumber
Buat kelas Anda sendiri
Customer
sebagai berikut:Dalam
onCreate()
metode AndaDi
xyz activity
kelas Anda perlu menggunakan kode berikut:sumber
Cara terbaik adalah memiliki kelas (sebut saja Kontrol) di aplikasi Anda yang akan menampung variabel statis tipe 'Pelanggan' (dalam kasus Anda). Inisialisasi variabel dalam Aktivitas Anda A.
Sebagai contoh:
Lalu pergi ke Aktivitas B dan ambil dari kelas Kontrol. Jangan lupa untuk menetapkan nol setelah menggunakan variabel, jika tidak memori akan terbuang.
sumber
Sekarang Anda ingin meneruskan objek kelas ini di startActivity. Cukup gunakan ini:
Ini berfungsi di sini karena MyClass mengimplementasikan
Serializable
.sumber
Jika Anda memilih menggunakan cara yang dijelaskan Samuh, ingatlah bahwa hanya nilai primitif yang dapat dikirim. Yaitu, nilai-nilai yang parcable. Jadi, jika objek Anda berisi objek kompleks ini tidak akan mengikuti. Sebagai contoh, variabel seperti Bitmap, HashMap dll ... Ini sulit untuk dilewati dengan niat.
Secara umum saya akan saran Anda untuk mengirim tipe data hanya primitif sebagai tambahan, seperti String, int, boolean dll Dalam kasus Anda akan:
String fname
,String lname
,int age
, danString address
.Pendapat saya: Objek yang lebih kompleks lebih baik dibagikan dengan menerapkan ContentProvider , SDCard , dll. Ini juga memungkinkan untuk menggunakan variabel statis , tetapi ini dapat dengan cepat menyebabkan kode rawan kesalahan ...
Tapi sekali lagi, ini hanya pendapat subjektif saya.
sumber
Saya menggunakan parcelable untuk mengirim data dari satu aktivitas ke aktivitas lainnya. Ini kode saya yang berfungsi dengan baik dalam proyek saya.
Dalam aktivitas, gunakan seperti ini:
Di ActivityB gunakan seperti ini untuk mendapatkan data:
sumber
Anda dapat mencoba menggunakan kelas itu. Batasannya adalah tidak dapat digunakan di luar satu proses.
Satu kegiatan:
Aktivitas lain:
sumber
Mulai aktivitas lain dari aktivitas ini dan berikan parameter melalui Bundle Object
Retrive data pada aktivitas lain (YourActivity)
Ini ok untuk jenis tipe data sederhana. Tetapi jika Anda ingin meneruskan data yang kompleks di antara aktivitas. Anda perlu membuat cerita bersambung terlebih dahulu.
Di sini kita memiliki Model Karyawan
Anda dapat menggunakan Gson lib yang disediakan oleh google untuk membuat serial data yang kompleks seperti ini
sumber
Pertanyaan ini juga dibahas dalam pertanyaan Stack Overflow lainnya. Silakan lihat solusi untuk Melewati data melalui niat menggunakan Serializable . Poin utama adalah tentang menggunakan
Bundle
objek yang menyimpan data yang diperlukan di dalamnyaIntent
.Untuk mengekstrak nilai:
Keuntungan dari
Serializable
kesederhanaannya. Namun, Anda harus mempertimbangkan menggunakanParcelable
metode jika Anda memerlukan banyak data untuk ditransfer, karenaParcelable
dirancang khusus untuk Android dan lebih efisien daripadaSerializable
. Anda dapat membuatParcelable
kelas menggunakan:sumber
Krak kelas seperti kelas kacang dan mengimplementasikan
Serializable
antarmuka. Kemudian kita bisa meneruskannya melaluiintent
metode, misalnya:Kemudian dapatkan dari aktivitas lain, misalnya:
sumber
Buat dua metode di Kelas khusus Anda seperti ini
Sekarang di pengirim Anda Kegiatan lakukan seperti ini
Dan di Aktivitas penerima Anda
sumber
Ya, menggunakan objek statis sejauh ini merupakan cara termudah untuk melakukan ini dengan objek non-serialis khusus.
sumber
static
adalah solusi yang lebih baik jika tidak praktis untuk terus memohonputExtra()
setiap properti yang ingin Anda sampaikan. Misalnya, sekarang, saya ingin meneruskanArrayList
yang berisi objek. Saya mungkin juga membuat ArrayList sayastatic
sebagai gantinya.Objek Aktivitas Android dapat dihancurkan dan disusun kembali. Jadi, Anda perlu menggunakan pendekatan lain untuk melihatnya - atau objek apa pun yang mereka buat !!! - naik. Artinya, Anda bisa lulus sebagai referensi kelas statis tetapi kemudian pegangan objek (Java menyebut ini "referensi", seperti halnya SmallTalk; tetapi mereka bukan referensi dalam arti C atau rakitan) akan mungkin tidak valid nantinya karena "fitur" Android OE adalah Kegiatan apa pun dapat dimusnahkan dan dilarutkan nanti.
Pertanyaan asli bertanya "Bagaimana cara meneruskan objek dari satu aktivitas ke aktivitas lainnya di Android" dan tidak ada yang menjawabnya. Yang pasti, Anda bisa membuat serial (Serializable, Parcelable, ke / dari JSON) dan meneruskan salinan data objek dan objek baru yang memiliki data yang sama dapat dibuat; tetapi TIDAK akan memiliki referensi / pegangan yang sama. Juga, banyak orang lain menyebutkan Anda dapat menyimpan referensi di toko statis. Dan itu akan berfungsi kecuali Android memutuskan untuk Menghancurkan Aktivitas Anda.
Jadi, untuk benar-benar menyelesaikan pertanyaan awal Anda akan memerlukan pencarian statis ditambah setiap objek akan memperbarui referensi ketika / jika itu dibuat ulang. Misalnya setiap Aktivitas Android akan mencatat ulang dirinya sendiri jika onCreate disebut. Anda juga dapat melihat bagaimana beberapa orang menggunakan daftar tugas untuk mencari Kegiatan berdasarkan nama. (sistem sementara menghancurkan instance aktivitas ini untuk menghemat ruang..getRunningTasks, daftar tugas secara efektif merupakan daftar khusus instance objek terbaru dari setiap Aktivitas).
Sebagai referensi:
Jadi, Bus Pesan adalah solusi yang bisa diterapkan. Ini pada dasarnya "punts". Alih-alih mencoba untuk memiliki referensi ke objek; lalu Anda mendesain ulang desain Anda untuk menggunakan MessagePassing alih-alih SequentialCode. Secara eksponensial lebih sulit untuk di-debug; tetapi itu memungkinkan Anda mengabaikan pemahaman OperatingEnvironment semacam ini. Secara efektif, setiap akses metode objek dibalik sehingga pemanggil memposting Pesan dan objek itu sendiri mendefinisikan penangan untuk pesan itu. Banyak lagi kode tetapi dapat membuatnya kuat dengan batasan Android OE.
Jika semua yang Anda inginkan adalah Aktivitas teratas (hal yang biasa di aplikasi Android karena "Konteks" diperlukan di mana-mana), maka Anda bisa meminta setiap Aktivitas mencantumkan dirinya sebagai "teratas" di ruang global statis setiap kali onResume disebut. Maka AlertDialog Anda atau apa pun yang membutuhkan konteks dapat langsung mengambilnya dari sana. Juga, ini agak kurang beruntung untuk menggunakan global tetapi dapat menyederhanakan menyampaikan suatu Konteks ke atas dan ke bawah di mana-mana dan, tentu saja, ketika Anda menggunakan MessageBus maka IT IS global.
sumber
Saya tahu statis itu buruk, tetapi sepertinya kami terpaksa menggunakannya di sini. Masalah dengan parceables / seriazables adalah bahwa kedua aktivitas memiliki instance duplikat dari objek yang sama = pemborosan memori dan CPU.
Aktivitas menelepon
Aktivitas yang dipanggil (perhatikan bahwa onCreate () dan onResume () dapat dipanggil beberapa kali ketika sistem menghancurkan dan membuat ulang aktivitas)
Cara lain adalah dengan mendeklarasikan bidang statis kelas yang ingin Anda sampaikan di kelas itu. Itu hanya akan melayani untuk tujuan ini. Jangan lupa itu bisa null di onCreate, karena paket aplikasi Anda telah diturunkan dari memori oleh sistem dan dimuat ulang nanti.
Ingatlah bahwa Anda masih perlu menangani siklus hidup aktivitas, Anda mungkin ingin menulis semua data langsung ke preferensi bersama, menyakitkan dengan struktur data yang kompleks seperti itu.
sumber
Di atas jawaban hampir semuanya benar, tetapi bagi mereka yang tidak memahami dan menjawabnya, Android memiliki kelas yang kuat. Maksudnya , Anda membagikan data antara tidak hanya aktivitas tetapi juga komponen Android lainnya (penerima broadcasr, servis untuk konten, asalkan kami menggunakan kelas ContetnResolver no Intent ). Dalam aktivitas Anda, Anda membangun niat
Dalam aktivitas receving yang Anda miliki
Anda harus mengimplementasikan antarmuka Parceable atau Serializable pada objek Anda untuk berbagi antar kegiatan. Sulit untuk mengimplementasikan Parcealbe daripada antarmuka Serializable pada objek itu sebabnya Android memiliki plugin terutama untuk ini. Unduh dan gunakan
sumber
Saya selalu bertanya-tanya mengapa ini tidak sesederhana memanggil metode kegiatan lain. Baru-baru ini saya menulis perpustakaan utilitas yang membuatnya hampir sesederhana itu. Anda dapat memeriksanya di sini ( https://github.com/noxiouswinter/gnlib_android/wiki/gnlauncher ).
GNLauncher membuat pengiriman objek / data ke suatu Aktivitas dari Aktivitas lain, dll. Semudah memanggil fungsi dalam Aktivitas dengan data yang diperlukan sebagai parameter. Ini memperkenalkan keamanan jenis dan menghilangkan semua kesibukan karena harus membuat cerita bersambung, melekat pada maksud menggunakan kunci string dan membatalkan yang sama di ujung lainnya.
Pemakaian
Tetapkan antarmuka dengan metode yang ingin Anda panggil pada Aktivitas untuk diluncurkan.
Implementasikan antarmuka di atas pada Activity untuk diluncurkan. Juga beri tahu GNLauncher ketika aktivitas siap.
Di Aktivitas lain, dapatkan proxy ke Aktivitas di atas dan panggil metode apa pun dengan parameter yang diinginkan.
Aktivitas pertama akan diluncurkan dan metode dipanggil dengan parameter yang diperlukan.
Prasyarat
Silakan merujuk ke https://github.com/noxiouswinter/gnlib_android/wiki#prasyarat untuk informasi tentang cara menambahkan dependensi.
sumber
Mengirim objek dari satu aktivitas ke aktivitas lain.
(1) aktivitas sumber
(2) aktivitas tujuan
sumber
Saya biasa mengatur objek dengan Pacelable atau Serializable untuk mentransfer, tetapi setiap kali saya menambahkan variabel lain ke objek (model), saya harus mendaftarkan semuanya. Sangat tidak nyaman.
Sangat mudah untuk mentransfer objek antara aktivitas atau fragmen.
Android DataCache
sumber
Kita dapat meneruskan objek dari satu aktivitas ke aktivitas lain:
Di dalam
poSuppliersDetails
kita memiliki beberapa nilai. Sekarang saya mengirim objek ini ke aktivitas target:Cara mendapatkan ini di ACtivityTwo:
sumber
Berikan satu aktivitas ke aktivitas lain:
Dapatkan nilai:
sumber
Halo semua, saya melihat banyak opsi bagus tapi saya bertanya-tanya mengapa Binding belum digunakan?
Membuat Binder cukup sederhana ...
Dan menciptakan parcelable untuk menggunakannya bukanlah eter yang buruk.
Logika ini sangat keren karena Anda benar-benar memberikan referensi dari aktivitas ke aktivitas.
dan untuk menerapkan ini, Anda hanya ...
Kirimkan itu
Mendapatkannya kembali
Heck seseorang bisa jadi gila dan membuat pengisap ini benar-benar generik.
sumber