微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[amadeus] 调用hotelOffers.get api 时出现异常

如何解决[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,HotelOffer>() {

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 举报,一经查实,本站将立刻删除。