如何解决[amadeus] 调用hotelOffers.get api 时出现异常
我是 Android 应用开发者,正在开发酒店搜索应用。 当我调用 amadeus hotelOffers.get api 时,出现以下异常。
2021-06-21 14:56:53.459 10103-10103/com.hotelfinder D/HotelOffersFragment: response: Error(errors=[],exception=java.lang.IllegalArgumentException: Platform class java.lang.Exception 需要显式要注册的 JsonAdapter 对于类 java.lang.Exception 异常 对于 com.amadeus.android.ApiResult$Error 类)
下面是我的代码。我参考了 amadeus-hotel-booking-android-master 项目中的代码。
class HotelOffersFragment : Fragment(R.layout.fragment_hotel_offers) {
private lateinit var binding: FragmentHotelOffersBinding
private val viewmodel by viewmodels<HotelOffersviewmodel>()
private lateinit var adapter: HotelOffersAdapter
private var searchJob: Job? = null
private val args: HotelOffersFragmentArgs by navArgs()
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
binding = FragmentHotelOffersBinding.bind(view)
initView()
val hotelSearchCriteria = args.searchCriteria
val location = hotelSearchCriteria.location
val radius = hotelSearchCriteria.radius
val rating = hotelSearchCriteria.ratings
val priceRange = hotelSearchCriteria.priceRange
searchHotels(location,radius,rating,priceRange)
}
private fun initView() {
if (!this::adapter.isInitialized) {
adapter = HotelOffersAdapter(viewmodel)
}
binding.hotelList.adapter = adapter.withLoadStateHeaderAndFooter(
header = ReposloadStateAdapter { adapter.retry() },footer = ReposloadStateAdapter { adapter.retry() }
)
binding.hotelList.addItemdecoration(
DividerItemdecoration(
requireContext(),LinearLayout.VERTICAL
).apply {
setDrawable(
ContextCompat.getDrawable(
requireContext(),R.drawable.divider_default
)!!
)
}
)
// Scroll to top when the list is refreshed from network.
lifecycleScope.launch {
adapter.loadStateFlow
.distinctUntilChangedBy { it.refresh }
.filter { it.refresh is LoadState.NotLoading }
.collect {
binding.progressBar.visibility = View.GONE
binding.hotelList.scrollToPosition(0)
}
}
}
private fun searchHotels(
location: Location,radius: Int,rating: Int,priceRange: String
) {
Log.d(TAG,"search hotels...")
binding.progressBar.visibility = View.VISIBLE
searchJob?.cancel()
searchJob = lifecycleScope.launch {
viewmodel.searchHotels(
location.latitude,location.longitude,listof(rating),priceRange
).collectLatest {
Log.d(TAG,it.toString())
adapter.submitData(it)
Log.d(TAG,it.toString())
}
}
}
override fun onDestroyView() {
super.onDestroyView()
binding.hotelList.adapter = null
}
companion object {
const val TAG = "HotelOffersFragment"
}
}
class HotelOffersviewmodel : viewmodel() {
private val _loading = mutablelivedata<Boolean>()
val loading: LiveData<Boolean> get() = _loading
fun searchHotels(
latitude: Double,longitude: Double,ratings: List<Int>,priceRange: String
): Flow<PagingData<HotelOffer>> {
return getSearchResultStream(
latitude,longitude,ratings,priceRange
).cachedIn(viewmodelScope)
}
private fun getSearchResultStream(
latitude: Double,priceRange: String
): Flow<PagingData<HotelOffer>> {
return Pager(
config = PagingConfig(
pageSize = NETWORK_PAGE_SIZE,enablePlaceholders = false
),pagingSourceFactory = {
HotelOffersPagingSource(
latitude,priceRange
)
}
).flow
}
fun onHotelOfferClick(view: View,hotelOffer: HotelOffer) {
}
companion object {
const val NETWORK_PAGE_SIZE = 10
private const val TAG = "HotelOffersviewmodel"
}
}
class HotelOffersPagingSource(
私人价值纬度:双,
私人价值经度:双,
私有 val 半径:Int,
私人评价:列表,
私人 val priceRange: 字符串
) : PagingSource
private val amadeus = HotelfinderApplication.amadeus
override suspend fun load(params: LoadParams<ApiResult.Success<List<HotelOffer>>>): LoadResult<ApiResult.Success<List<HotelOffer>>,HotelOffer> {
Log.d(HotelOffersFragment.TAG,"load")
val key: ApiResult.Success<List<HotelOffer>>? = params.key
val response = when {
// We should load next page
params is LoadParams.Append && key != null -> {
Log.d(HotelOffersFragment.TAG,"load next")
amadeus.next(key)
}
// We should load prevIoUs page
params is LoadParams.Prepend && key != null -> {
Log.d(HotelOffersFragment.TAG,"load prevIoUs")
amadeus.prevIoUs(key)
}
// We should refresh using `amadeus.self()` only if key is not null
params is LoadParams.Refresh && key != null -> {
Log.d(HotelOffersFragment.TAG,"load self")
amadeus.self(key)
}
// Key is null,it's a cold start for the lib,we should query the api
else -> {
Log.d(HotelOffersFragment.TAG,"query the api")
amadeus.shopping.hotelOffers.get(
latitude = latitude,longitude = longitude,radius = radius,radiusUnit = "MILE",ratings = ratings,priceRange = priceRange,currency = "USD",// We use the same page size set in PageConfig
pageLimit = HotelOffersviewmodel.NETWORK_PAGE_SIZE
)
}
}
Log.d(HotelOffersFragment.TAG,"response: " + response.toString())
return when (response) {
is ApiResult.Success -> {
Log.d(HotelOffersFragment.TAG,"${response.data}")
LoadResult.Page(
data = response.data,prevKey = if (response.hasPrevIoUs()) response else null,nextKey = if (response.hasNext()) response else null
)
}
else -> {
Log.e(HotelOffersFragment.TAG,"Error!!")
LoadResult.Error(IllegalStateException("Impossible to load requested page"))
}
}
}
}
谁能帮我解决这个异常?
谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。