Как использовать Intent, чтобы поместить список класса данных в kotlin - PullRequest
0 голосов
/ 15 марта 2020

Я хочу отправить список класса данных (list) для нового действия с использованием Intent. В моем коде ниже (SplashScreenRepository.kt) сначала я использую модификацию для подключения API (и это сделано), и когда ответ успешен, я помещаю данные в список DataPeople. Во второй части мне нужно отправить этот список данных для нового действия с Intent для представления в рециркуляторе. Итак, я sh поместил всю информацию в intent.putExtra, но как?

DataPeople.kt

data class DataPeople(
    val name : String,
    val height : String,
    val mass : String,
    val hair_color : String,
    val skin_color : String,
    val eye_color : String,
    val birth_year : String,
    val gender : String
) 

SplashScreenRepository.kt

fun getDataInApi(onFinnish : (List<DataPeople>) -> Unit) {
        val retrofitClient = NetworkUtils.getRetrofitInstance()
        val endpoint = retrofitClient.create(Endpoint::class.java)
        val callDataOfPeople = endpoint.dataOfPeople()

        val list = ArrayList<DataPeople>()

        callDataOfPeople.enqueue(object : Callback<SerializeDataPeople?> {
            override fun onResponse(call: Call<SerializeDataPeople?>, response: Response<SerializeDataPeople?>) {
                response.body().let{
                    val note: SerializeDataPeople? = it

                    loop@ for (i in 0..9) {
                        name = note?.results?.get(i)?.name.toString()
                        height = note?.results?.get(i)?.height.toString()
                        mass = note?.results?.get(i)?.mass.toString()
                        hair_color = note?.results?.get(i)?.hair_color.toString()
                        skin_color = note?.results?.get(i)?.skin_color.toString()
                        eye_color = note?.results?.get(i)?.eye_color.toString()
                        birth_year = note?.results?.get(i)?.birth_year.toString()
                        gender = note?.results?.get(i)?.gender.toString()

                        list.add(DataPeople(name, height, mass, hair_color, skin_color, eye_color, birth_year, gender))
                    }
                    dataPeopleList = list
                    onFinnish(dataPeopleList)
                }
            }

            override fun onFailure(call: Call<SerializeDataPeople?>, t: Throwable) {
                Log.e("onFailure error", t?.message)
                onFinnish(emptyList())
            }
        })
    }

SplashScreen .kt

class SplashScreenActivity : AppCompatActivity() {
    private lateinit var splashScreenViewModel: SplashScreenViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash_screen)

        (...)

        splashScreenViewModel.getIsUpdatingLiveDataLoaded()?.observe(this, Observer{ it ->
            when(it){
                SplashScreenViewModel.States.DONE ->{
                    Toast.makeText(this, "Data is ready.", Toast.LENGTH_LONG).show()

                    splashScreenViewModel.getPeopleLiveData()?.observe(this, Observer {
                        val intent = Intent(this, MainActivity::class.java)
                        intent.putExtra("list", it)
                        startActivity(intent)
                    })
                }
                (...)
            }
        })
    }

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете создать таблицу Sqlite, используя Комната :

DataPeople.kt

@Entity
data class DataPeople(
    @PrimaryKey val id :Int,
    val name : String,
    val height : String,
    val mass : String,
    val hair_color : String,
    val skin_color : String,
    val eye_color : String,
    val birth_year : String,
    val gender : String
) 

DataPeopleDao.kt

@Dao
interface DataPeopleDao {
    @Query("SELECT * FROM DataPeople")
    fun getAll(): List<DataPeople>

    @Insert
    fun insertAll(dataPeople:List<DataPeople>)
}

AppDatabase. kt

@Database(entities = arrayOf(DataPeople::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun dataPeopleDao(): DataPeopleDao
}

SplashScreenActivty.kt

override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)
    val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()
    splashScreenViewModel.getIsUpdatingLiveDataLoaded()?.observe(this, Observer{ it ->
            when(it){
                SplashScreenViewModel.States.DONE ->{

                    splashScreenViewModel.getPeopleLiveData()?.observe(this, Observer {
                        //execute this line on a background thread
                        db.dataPeopleDao().insertAll(it)
                        val intent = Intent(this, MainActivity::class.java)
                        startActivity(intent)
                    })
                }

            }
        })


}

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {

    val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()
    //execute this line on a background thread
    val peopleData = db.dataPeopleDao().getAll()


}

Лучший путь

Вы можете использовать Фрагменты вместо действий и обмениваться данными между ними, используя ViewModel

НО: я предлагаю избегать использования: 2-й подход Синглтон может повредить вам. Файлы 3-го подхода всегда медленнее, чем базы данных.

0 голосов
/ 16 марта 2020

Если имеется значительное количество данных, вы не можете поместить их в Intent, поскольку существуют ограничения по размеру. Вообще говоря, это неправильный подход. Вы можете попробовать один из следующих подходов:

  • Поместить данные в базу данных SQLite, к которой другие действия могут получить доступ
  • Поместить ссылку на данные в переменную static, которая может быть доступным для всех других операций
  • Записать данные в файл, а другие операции прочитать файл
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...