Android webservice响应的通用方法
我正在从webservices获取响应。除卡车和猫等阵列外,所有响应均相同。以下是两个示例,以供理解。我正在使用liveData并进行改装 在AppWebServices接口中,我创建了GsonBuilder并设置了registerTypeAdapter(WebServiceResponse::class.java, 反序列化程序(Company::class.java)) 我想让这家公司在WebServiceResponse中充满活力。我为AppWebServices尝试了T类型,但它不起作用Android webservice响应的通用方法,android,generics,kotlin,retrofit,android-livedata,Android,Generics,Kotlin,Retrofit,Android Livedata,我正在从webservices获取响应。除卡车和猫等阵列外,所有响应均相同。以下是两个示例,以供理解。我正在使用liveData并进行改装 在AppWebServices接口中,我创建了GsonBuilder并设置了registerTypeAdapter(WebServiceResponse::class.java, 反序列化程序(Company::class.java)) 我想让这家公司在WebServiceResponse中充满活力。我为AppWebServices尝试了T类型,但它不起作用
{
"status": true,
"statusMessage" : "Success",
"data": {
"trucks": [{
"id": 1,
"engine": "big",
"wheels" : 12
},
{
"id": 2,
"engine": "super big",
"wheels" : 128
}]
}
}
第二个样本
{
"status": true,
"statusMessage" : "Success",
"data": {
"cats": [{
"id": 1,
"title": "Cat 1"
},
{
"id": 2,
"title": "Cat 2"
}]
}
}
经过搜索,我找到了。它工作得很好
公司活动类
class CompaniesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_companies)
initializeUi()
}
private fun initializeUi() {
val factory = InjectorUtils.provideCompanyViewModelFactory()
val viewModel = ViewModelProviders.of(this, factory)
.get(CompanyViewModel::class.java)
viewModel.getCompanies().observe(this, Observer { companies ->
setupRecyclerView(companies)
})
}
private fun setupRecyclerView(companies: List<Company>) {
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = CompanyAdapter(companies)
}
}
object InjectorUtils {
fun provideCompanyViewModelFactory() : CompanyViewModelFactory {
val companyDao = Database.getInstance().companyDao
val companyRepository = CompanyRepository.getInstance(companyDao)
return CompanyViewModelFactory(companyRepository)
}
}
class CompanyViewModel(private val companyRepository: CompanyRepository) : ViewModel() {
fun addCompany(company: Company) = companyRepository.addCompany(company)
fun addcompanies(companies: List<Company>) = companyRepository.addCompanies(companies)
fun getCompanies() = companyRepository.getCompanies()
}
class CompanyRepository private constructor(private val companyDao: CompanyDao) {
companion object {
@Volatile private var instance: CompanyRepository? = null
fun getInstance(companyDao: CompanyDao) =
instance ?: synchronized(this) {
instance
?: CompanyRepository(companyDao).also { instance = it }
}
}
fun addCompany(company: Company) {
companyDao.addCompany(company)
}
fun addCompanies(companies: List<Company>) {
companyDao.addCompanies(companies)
}
private fun updatedCompanies(): LiveData<List<Company>> {
return companyDao.getCompanies()
}
fun getCompanies(): LiveData<List<Company>> {
val companies = companyDao.getCompanies().value
if (companies == null || companies.isEmpty()) {
val appWebServices = AppWebServices()
GlobalScope.launch(Dispatchers.Main) {
val response = appWebServices.getNearestCompanies(33.6658432, 73.0726399, 0, 100).await()
if (response.status && response.result.isNotEmpty()) {
addCompanies(response.result)
}
}
}
return updatedCompanies()
}
}
data class WebServiceResponse<T> (
@SerializedName(Keys.DATA)
val result: List<T>,
val status: Boolean,
val statusMessage: String
)
class CompanyDao {
private val companyList = mutableListOf<Company>()
private val companies = MutableLiveData<List<Company>>()
init {
companies.value = companyList
}
fun addCompany(company: Company) {
companyList.add(company)
companies.value = companyList
}
fun addCompanies(companies: List<Company>) {
companyList.addAll(companies)
this.companies.value = companyList
}
fun getCompanies() = companies as LiveData<List<Company>>
}
公司视图模型类
class CompaniesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_companies)
initializeUi()
}
private fun initializeUi() {
val factory = InjectorUtils.provideCompanyViewModelFactory()
val viewModel = ViewModelProviders.of(this, factory)
.get(CompanyViewModel::class.java)
viewModel.getCompanies().observe(this, Observer { companies ->
setupRecyclerView(companies)
})
}
private fun setupRecyclerView(companies: List<Company>) {
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = CompanyAdapter(companies)
}
}
object InjectorUtils {
fun provideCompanyViewModelFactory() : CompanyViewModelFactory {
val companyDao = Database.getInstance().companyDao
val companyRepository = CompanyRepository.getInstance(companyDao)
return CompanyViewModelFactory(companyRepository)
}
}
class CompanyViewModel(private val companyRepository: CompanyRepository) : ViewModel() {
fun addCompany(company: Company) = companyRepository.addCompany(company)
fun addcompanies(companies: List<Company>) = companyRepository.addCompanies(companies)
fun getCompanies() = companyRepository.getCompanies()
}
class CompanyRepository private constructor(private val companyDao: CompanyDao) {
companion object {
@Volatile private var instance: CompanyRepository? = null
fun getInstance(companyDao: CompanyDao) =
instance ?: synchronized(this) {
instance
?: CompanyRepository(companyDao).also { instance = it }
}
}
fun addCompany(company: Company) {
companyDao.addCompany(company)
}
fun addCompanies(companies: List<Company>) {
companyDao.addCompanies(companies)
}
private fun updatedCompanies(): LiveData<List<Company>> {
return companyDao.getCompanies()
}
fun getCompanies(): LiveData<List<Company>> {
val companies = companyDao.getCompanies().value
if (companies == null || companies.isEmpty()) {
val appWebServices = AppWebServices()
GlobalScope.launch(Dispatchers.Main) {
val response = appWebServices.getNearestCompanies(33.6658432, 73.0726399, 0, 100).await()
if (response.status && response.result.isNotEmpty()) {
addCompanies(response.result)
}
}
}
return updatedCompanies()
}
}
data class WebServiceResponse<T> (
@SerializedName(Keys.DATA)
val result: List<T>,
val status: Boolean,
val statusMessage: String
)
class CompanyDao {
private val companyList = mutableListOf<Company>()
private val companies = MutableLiveData<List<Company>>()
init {
companies.value = companyList
}
fun addCompany(company: Company) {
companyList.add(company)
companies.value = companyList
}
fun addCompanies(companies: List<Company>) {
companyList.addAll(companies)
this.companies.value = companyList
}
fun getCompanies() = companies as LiveData<List<Company>>
}
class CompanyViewModel(private val companyRepository:companyRepository):ViewModel(){
fun addCompany(company:company)=companyRepository.addCompany(company)
乐趣添加公司(公司:列表)=公司存储。添加公司(公司)
fun getcompanys()=companyRepository.getcompanys()
}
CompanyRepository.class
class CompaniesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_companies)
initializeUi()
}
private fun initializeUi() {
val factory = InjectorUtils.provideCompanyViewModelFactory()
val viewModel = ViewModelProviders.of(this, factory)
.get(CompanyViewModel::class.java)
viewModel.getCompanies().observe(this, Observer { companies ->
setupRecyclerView(companies)
})
}
private fun setupRecyclerView(companies: List<Company>) {
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = CompanyAdapter(companies)
}
}
object InjectorUtils {
fun provideCompanyViewModelFactory() : CompanyViewModelFactory {
val companyDao = Database.getInstance().companyDao
val companyRepository = CompanyRepository.getInstance(companyDao)
return CompanyViewModelFactory(companyRepository)
}
}
class CompanyViewModel(private val companyRepository: CompanyRepository) : ViewModel() {
fun addCompany(company: Company) = companyRepository.addCompany(company)
fun addcompanies(companies: List<Company>) = companyRepository.addCompanies(companies)
fun getCompanies() = companyRepository.getCompanies()
}
class CompanyRepository private constructor(private val companyDao: CompanyDao) {
companion object {
@Volatile private var instance: CompanyRepository? = null
fun getInstance(companyDao: CompanyDao) =
instance ?: synchronized(this) {
instance
?: CompanyRepository(companyDao).also { instance = it }
}
}
fun addCompany(company: Company) {
companyDao.addCompany(company)
}
fun addCompanies(companies: List<Company>) {
companyDao.addCompanies(companies)
}
private fun updatedCompanies(): LiveData<List<Company>> {
return companyDao.getCompanies()
}
fun getCompanies(): LiveData<List<Company>> {
val companies = companyDao.getCompanies().value
if (companies == null || companies.isEmpty()) {
val appWebServices = AppWebServices()
GlobalScope.launch(Dispatchers.Main) {
val response = appWebServices.getNearestCompanies(33.6658432, 73.0726399, 0, 100).await()
if (response.status && response.result.isNotEmpty()) {
addCompanies(response.result)
}
}
}
return updatedCompanies()
}
}
data class WebServiceResponse<T> (
@SerializedName(Keys.DATA)
val result: List<T>,
val status: Boolean,
val statusMessage: String
)
class CompanyDao {
private val companyList = mutableListOf<Company>()
private val companies = MutableLiveData<List<Company>>()
init {
companies.value = companyList
}
fun addCompany(company: Company) {
companyList.add(company)
companies.value = companyList
}
fun addCompanies(companies: List<Company>) {
companyList.addAll(companies)
this.companies.value = companyList
}
fun getCompanies() = companies as LiveData<List<Company>>
}
class CompanyRepository私有构造函数(private val companyDao:companyDao){
伴星{
@易失性私有变量实例:CompanyRepository?=null
fun getInstance(companyDao:companyDao)=
实例?:已同步(此){
例子
?:CompanyRepository(companyDao)。也是{instance=it}
}
}
公司(公司名称:公司){
companyDao.addCompany(公司)
}
娱乐公司(公司:列表){
companyDao.addCompanies(公司)
}
private fun UpdatedCompanys():LiveData{
return companyDao.getcompanys()
}
fun getCompanies():LiveData{
val companys=companyDao.getcompanys().value
if(companys==null | | companys.isEmpty()){
val appWebServices=appWebServices()
GlobalScope.launch(Dispatchers.Main){
val response=appWebServices.getnearestcompanys(33.6658432,73.0726399,0100).await()
if(response.status&&response.result.isNotEmpty()){
addcompanys(response.result)
}
}
}
返回更新的公司()
}
}
反序列化程序.java
class Deserializer<T>(private val clazz: Type): JsonDeserializer<WebServiceResponse<T>> {
@Throws(JsonParseException::class)
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): WebServiceResponse<T>? {
val jsonObject = json as JsonObject
var status = true ///jsonObject.get("status")
var statusMessage = "hello"//jsonObject.get("statusMessage")
val data = jsonObject.get("data") as JsonObject
val companies = data.get("companies") as JsonArray
val list = mutableListOf<T>();
for (element in companies) {
val ele = element as JsonElement
list.add(context!!.deserialize(ele, clazz))
}
return WebServiceResponse<T>(list,status,statusMessage);
}
}
类反序列化器(私有val clazz:Type):JsonDeserializer{
@抛出(JsonParseException::类)
重写有趣的反序列化(json:JsonElement?、TypeSoft:Type?、context:JsonDeserializationContext?):WebServiceResponse{
val jsonObject=json作为jsonObject
var status=true///jsonObject.get(“状态”)
var statusMessage=“hello”//jsonObject.get(“statusMessage”)
val data=jsonObject.get(“数据”)作为jsonObject
val companys=data.get(“companys”)作为JsonArray
val list=mutableListOf();
对于(公司中的要素){
val ele=作为JsonElement的元素
list.add(context!!.deserialize(ele,clazz))
}
返回WebServiceResponse(列表、状态、状态消息);
}
}
AppWebServices.class改型接口
interface AppWebServices {
@GET(Keys.GET_NEARST_COMPANY_LIST)
fun getNearestCompanies(
@Query(Keys.CURRENT_LAT) latitude: Double,
@Query(Keys.CURRENT_LON) longitude: Double,
@Query(Keys.START_LIST_INDEX) startIndex: Int,
@Query(Keys.END_LIST_INDEX) endIndex: Int
) : Deferred<WebServiceResponse<Company>>
companion object {
operator fun invoke(): AppWebServices {
val okHttpClient = OkHttpClient.Builder().build()
var gson = GsonBuilder().setLenient()
.registerTypeAdapter(WebServiceResponse::class.java, Deserializer<WebServiceResponse<Company>>(Company::class.java))
.create()
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BuildConfig.BASE_URL)
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(AppWebServices::class.java)
}
}
}
接口AppWebServices{
@获取(密钥。获取最接近的公司列表)
有趣的近邻公司(
@查询(键当前位置)纬度:双,
@查询(key.CURRENT_LON)经度:双,
@查询(key.START\u LIST\u INDEX)startIndex:Int,
@查询(key.END\u LIST\u INDEX)endIndex:Int
):延期
伴星{
运算符fun invoke():AppWebServices{
val okHttpClient=okHttpClient.Builder().build()
var gson=GsonBuilder().setLenient()
.registerTypeAdapter(WebServiceResponse::class.java,反序列化器(Company::class.java))
.create()
return reformation.Builder()
.客户(okHttpClient)
.baseUrl(BuildConfig.BASE\u URL)
.addCallAdapterFactory(coroutineCalAdapterFactory())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(AppWebServices::class.java)
}
}
}
WebServiceResponse.class
class CompaniesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_companies)
initializeUi()
}
private fun initializeUi() {
val factory = InjectorUtils.provideCompanyViewModelFactory()
val viewModel = ViewModelProviders.of(this, factory)
.get(CompanyViewModel::class.java)
viewModel.getCompanies().observe(this, Observer { companies ->
setupRecyclerView(companies)
})
}
private fun setupRecyclerView(companies: List<Company>) {
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = CompanyAdapter(companies)
}
}
object InjectorUtils {
fun provideCompanyViewModelFactory() : CompanyViewModelFactory {
val companyDao = Database.getInstance().companyDao
val companyRepository = CompanyRepository.getInstance(companyDao)
return CompanyViewModelFactory(companyRepository)
}
}
class CompanyViewModel(private val companyRepository: CompanyRepository) : ViewModel() {
fun addCompany(company: Company) = companyRepository.addCompany(company)
fun addcompanies(companies: List<Company>) = companyRepository.addCompanies(companies)
fun getCompanies() = companyRepository.getCompanies()
}
class CompanyRepository private constructor(private val companyDao: CompanyDao) {
companion object {
@Volatile private var instance: CompanyRepository? = null
fun getInstance(companyDao: CompanyDao) =
instance ?: synchronized(this) {
instance
?: CompanyRepository(companyDao).also { instance = it }
}
}
fun addCompany(company: Company) {
companyDao.addCompany(company)
}
fun addCompanies(companies: List<Company>) {
companyDao.addCompanies(companies)
}
private fun updatedCompanies(): LiveData<List<Company>> {
return companyDao.getCompanies()
}
fun getCompanies(): LiveData<List<Company>> {
val companies = companyDao.getCompanies().value
if (companies == null || companies.isEmpty()) {
val appWebServices = AppWebServices()
GlobalScope.launch(Dispatchers.Main) {
val response = appWebServices.getNearestCompanies(33.6658432, 73.0726399, 0, 100).await()
if (response.status && response.result.isNotEmpty()) {
addCompanies(response.result)
}
}
}
return updatedCompanies()
}
}
data class WebServiceResponse<T> (
@SerializedName(Keys.DATA)
val result: List<T>,
val status: Boolean,
val statusMessage: String
)
class CompanyDao {
private val companyList = mutableListOf<Company>()
private val companies = MutableLiveData<List<Company>>()
init {
companies.value = companyList
}
fun addCompany(company: Company) {
companyList.add(company)
companies.value = companyList
}
fun addCompanies(companies: List<Company>) {
companyList.addAll(companies)
this.companies.value = companyList
}
fun getCompanies() = companies as LiveData<List<Company>>
}
数据类WebServiceResponse(
@SerializedName(Keys.DATA)
val结果:列表,
val状态:布尔值,
val状态消息:字符串
)
CompanyDao.class
class CompaniesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_companies)
initializeUi()
}
private fun initializeUi() {
val factory = InjectorUtils.provideCompanyViewModelFactory()
val viewModel = ViewModelProviders.of(this, factory)
.get(CompanyViewModel::class.java)
viewModel.getCompanies().observe(this, Observer { companies ->
setupRecyclerView(companies)
})
}
private fun setupRecyclerView(companies: List<Company>) {
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = CompanyAdapter(companies)
}
}
object InjectorUtils {
fun provideCompanyViewModelFactory() : CompanyViewModelFactory {
val companyDao = Database.getInstance().companyDao
val companyRepository = CompanyRepository.getInstance(companyDao)
return CompanyViewModelFactory(companyRepository)
}
}
class CompanyViewModel(private val companyRepository: CompanyRepository) : ViewModel() {
fun addCompany(company: Company) = companyRepository.addCompany(company)
fun addcompanies(companies: List<Company>) = companyRepository.addCompanies(companies)
fun getCompanies() = companyRepository.getCompanies()
}
class CompanyRepository private constructor(private val companyDao: CompanyDao) {
companion object {
@Volatile private var instance: CompanyRepository? = null
fun getInstance(companyDao: CompanyDao) =
instance ?: synchronized(this) {
instance
?: CompanyRepository(companyDao).also { instance = it }
}
}
fun addCompany(company: Company) {
companyDao.addCompany(company)
}
fun addCompanies(companies: List<Company>) {
companyDao.addCompanies(companies)
}
private fun updatedCompanies(): LiveData<List<Company>> {
return companyDao.getCompanies()
}
fun getCompanies(): LiveData<List<Company>> {
val companies = companyDao.getCompanies().value
if (companies == null || companies.isEmpty()) {
val appWebServices = AppWebServices()
GlobalScope.launch(Dispatchers.Main) {
val response = appWebServices.getNearestCompanies(33.6658432, 73.0726399, 0, 100).await()
if (response.status && response.result.isNotEmpty()) {
addCompanies(response.result)
}
}
}
return updatedCompanies()
}
}
data class WebServiceResponse<T> (
@SerializedName(Keys.DATA)
val result: List<T>,
val status: Boolean,
val statusMessage: String
)
class CompanyDao {
private val companyList = mutableListOf<Company>()
private val companies = MutableLiveData<List<Company>>()
init {
companies.value = companyList
}
fun addCompany(company: Company) {
companyList.add(company)
companies.value = companyList
}
fun addCompanies(companies: List<Company>) {
companyList.addAll(companies)
this.companies.value = companyList
}
fun getCompanies() = companies as LiveData<List<Company>>
}
class CompanyDao{
private val companyList=mutableListOf()
私有val公司=MutableLiveData()
初始化{
companys.value=公司列表
}
公司(公司名称:公司){
公司列表添加(公司)
companys.value=公司列表
}
娱乐公司(公司:列表){
companyList.addAll(公司)
this.companys.value=公司列表
}
fun getCompanies()=公司作为LiveData
}
我想要一个解决方案,告诉我的服务我想要什么样的响应val-appWebServices=appWebServices()
因此它可以将其设置为
.registerTypeAdapter(WebServiceResponse::class.java, Deserializer<WebServiceResponse<T>>(T::class.java))
.registerTypeAdapter(WebServiceResponse::class.java,反序列化器(T::class.java))
您可以使用访问函数体中的泛型类型参数
当前的invoke
函数包含大量代码,内联会将所有行复制到调用位置。最好将函数拆分为具体化的
部分,以捕获类
对象和创建代理的内部部分。要从inline
方法访问internal
方法,必须使用@PublishedApi
注释
companion object {
inline operator fun <reified T> invoke() =
createProxy(T::class.java)
@PublishedApi
internal fun <T> createProxy(clazz: Class<T>): AppWebServices {
...
}
}
伴生对象{
内联运算符调用()=
createProxy(T::class.java)
@达皮
内部代理(clazz:Class):AppWebServices{
...
}
}
现在,您可以创建您想要的服务:
val appWebServices = AppWebServices<Company>()
val-appWebServices=appWebServices()
谢谢