Android 进度条加载未显示来自服务器的响应?

Android 进度条加载未显示来自服务器的响应?,android,kotlin,mvvm,android-progressbar,kotlin-coroutines,Android,Kotlin,Mvvm,Android Progressbar,Kotlin Coroutines,我正在开发新闻应用程序,但TopHeadlinesFragment加载进度条未显示来自服务器的响应 我想知道我在哪里犯了错误,为了显示服务器的响应我必须做什么。可能是topHeadlinesFragment.kt或koin网络模块中的观察者出了问题 下面是我的应用程序截图 在我的TopHeadlinesFragment.kt下面 class TopHeadlinesFragment : Fragment() { private lateinit var binding: Fragme

我正在开发新闻应用程序,但TopHeadlinesFragment加载进度条未显示来自服务器的响应 我想知道我在哪里犯了错误,为了显示服务器的响应我必须做什么。可能是topHeadlinesFragment.kt或koin网络模块中的观察者出了问题

下面是我的应用程序截图

在我的TopHeadlinesFragment.kt下面

class TopHeadlinesFragment : Fragment() {

    private lateinit var binding: FragmentTopHeadlinesBinding
    private val viewModel by viewModel<MainViewModel>()


    private lateinit var topHeadlinesAdapter: TopHeadlinesAdapter
    // private val newsRepository: NewsRepository by inject()


    //3
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding =
            DataBindingUtil.inflate(inflater, R.layout.fragment_top_headlines, container, false)
        binding.lifecycleOwner = this
        topHeadlinesAdapter = TopHeadlinesAdapter()
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initViewModel()
      //  loadingAds()


    }

    private fun initViewModel() {
        viewModel.sportList.observe(this, Observer { result ->

            when (result) {
                is Results.Success -> {
                    val newList = result.data
                    if (newList != null) {
                        topHeadlinesAdapter.updateData(newList)
                    }
                    binding.recyclerView.adapter = topHeadlinesAdapter
                    topHeadlinesAdapter.notifyDataSetChanged()

                    viewModel.showLoading.observe(this, Observer {showLoading ->
                        pb.visibility = if (showLoading) View.VISIBLE else View.GONE
                    })
                }
                is Results.Failure -> {
                    viewModel.showLoading.observe(this, Observer {showLoading ->
                        pb.visibility = if (showLoading) View.INVISIBLE else View.GONE
                })
            }


        }

        viewModel.loadNews()
    })



    }


    }
在我的MainViewModel.kt下面

class MainViewModel(val newsRepository: NewsRepository) : ViewModel(), CoroutineScope {
    // Coroutine's background job
    val job = Job()

    // Define default thread for Coroutine as Main and add job
    override val coroutineContext: CoroutineContext = Dispatchers.Main + job

    private val _showLoading = MutableLiveData<Boolean>()
    private val _sportList = MutableLiveData<Results>()

    val showLoading: LiveData<Boolean>
        get() = _showLoading

    val sportList: LiveData<Results>
        get() = _sportList


    fun loadNews() {
        // Show progressBar during the operation on the MAIN (default) thread
        _showLoading.value = true
        // launch the Coroutine
        launch {
            // Switching from MAIN to IO thread for API operation
            // Update our data list with the new one from API
            val result =  newsRepository.refresh()
            _sportList.value = result
            _showLoading.value = false
        }
    }

    override fun onCleared() {
        job.cancel()
    }

}
类MainViewModel(val newsRepository:newsRepository):ViewModel(),CoroutineScope{
//Coroutine的背景工作
val job=job()
//将协同程序的默认线程定义为主线程并添加作业
override val coroutineContext:coroutineContext=Dispatchers.Main+job
private val_showLoading=MutableLiveData()
private val_sportList=MutableLiveData()
val showLoading:LiveData
get()=\u正在加载
val sportList:LiveData
get()=\u sportList
有趣的新闻{
//在主(默认)线程上的操作期间显示progressBar
_showLoading.value=true
//启动协同程序
发射{
//从主线程切换到IO线程以进行API操作
//用API中的新数据更新我们的数据列表
val result=newsRepository.refresh()
_sportList.value=结果
_showLoading.value=false
}
}
覆盖有趣的onCleared(){
作业。取消()
}
}
在my KoinNetworkModule.kt下面

const val BASE_URL = "https://newsapi.org/"
val netModule = module {


    single {
        createWebService<SportNewsInterface>(
            okHttpClient = createHttpClient(),
            factory = RxJava2CallAdapterFactory.create(),
            baseUrl = BASE_URL
        )
    }
}

/* Returns a custom OkHttpClient instance with interceptor. Used for building Retrofit service */
fun createHttpClient(): OkHttpClient {
    val client = OkHttpClient.Builder()
    client.readTimeout(5 * 60, TimeUnit.SECONDS)
    return client.addInterceptor {
        val original = it.request()
        val requestBuilder = original.newBuilder()
        requestBuilder.header("Content-Type", "application/json")
        val request = requestBuilder.method(original.method, original.body).build()
        return@addInterceptor it.proceed(request)
    }.build()
}

/* function to build our Retrofit service */
inline fun <reified T> createWebService(
    okHttpClient: OkHttpClient,
    factory: CallAdapter.Factory, baseUrl: String
): T {
    val retrofit = Retrofit.Builder()
        .baseUrl(baseUrl)
        .addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .addCallAdapterFactory(factory)
        .client(okHttpClient)
        .build()
    return retrofit.create(T::class.java)
}
const val BASE\u URL=”https://newsapi.org/"
val网络模块=模块{
单身{
createWebService(
okHttpClient=createHttpClient(),
factory=RxJava2CallAdapterFactory.create(),
baseUrl=基本URL
)
}
}
/*返回带有拦截器的自定义OkHttpClient实例。用于建筑物翻新服务*/
fun createHttpClient():OkHttpClient{
val client=OkHttpClient.Builder()
客户端读取超时(5*60,时间单位秒)
返回client.addInterceptor{
val original=it.request()
val requestBuilder=original.newBuilder()
header(“内容类型”、“应用程序/json”)
val request=requestBuilder.method(original.method,original.body.build())
return@addInterceptor继续(请求)
}.build()
}
/*功能,以建立我们的改装服务*/
内嵌式Web服务(
okHttpClient:okHttpClient,
工厂:CallAdapter.factory,baseUrl:String
):T{
val reformation=reformation.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create())
.addCallAdapterFactory(coroutineCalAdapterFactory())
.addCallAdapterFactory(工厂)
.客户(okHttpClient)
.build()
return reformation.create(T::class.java)
}

找到你的问题了。如果您真的想显示响应,那么无论您得到什么,都可以在改造实例中使用此代码。拦截器的角色用于在日志级别显示请求和响应。您可以在日志窗口中找到API、请求和响应的URL

现在像这样修改KoinNetworkModule.kt

            const val BASE_URL = "https://newsapi.org/"
            val netModule = module {


                single {
                    createWebService<SportNewsInterface>(
                        okHttpClient = createHttpClient(),
                        factory = RxJava2CallAdapterFactory.create(),
                        baseUrl = BASE_URL
                    )
                }
            }

            /* Returns a custom OkHttpClient instance with interceptor. Used for building Retrofit service */
            fun createHttpClient(): OkHttpClient {
val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY

        val client1 = OkHttpClient.Builder()
            .connectTimeout(2, TimeUnit.MINUTES)
            .writeTimeout(2, TimeUnit.MINUTES) // write timeout
            .readTimeout(2, TimeUnit.MINUTES) // read timeout

            .addInterceptor(interceptor)
            .build()

            /* function to build our Retrofit service */
            inline fun <reified T> createWebService(
                okHttpClient: OkHttpClient,
                factory: CallAdapter.Factory, baseUrl: String
            ): T {



                val retrofit = Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
                    .addCallAdapterFactory(CoroutineCallAdapterFactory())
                    .addCallAdapterFactory(factory)
                    .client(client1)
                    .build()
                return retrofit.create(T::class.java)
            }
const val BASE\u URL=”https://newsapi.org/"
val网络模块=模块{
单身{
createWebService(
okHttpClient=createHttpClient(),
factory=RxJava2CallAdapterFactory.create(),
baseUrl=基本URL
)
}
}
/*返回带有拦截器的自定义OkHttpClient实例。用于建筑物翻新服务*/
fun createHttpClient():OkHttpClient{
val interceptor=HttpLoggingInterceptor()
interceptor.level=HttpLoggingInterceptor.level.BODY
val client1=OkHttpClient.Builder()
.connectTimeout(2,时间单位为分钟)
.writeTimeout(2,TimeUnit.MINUTES)//写入超时
.readTimeout(2,TimeUnit.MINUTES)//读取超时
.addInterceptor(拦截器)
.build()
/*功能,以建立我们的改装服务*/
内嵌式Web服务(
okHttpClient:okHttpClient,
工厂:CallAdapter.factory,baseUrl:String
):T{
val reformation=reformation.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create())
.addCallAdapterFactory(coroutineCalAdapterFactory())
.addCallAdapterFactory(工厂)
.客户(客户1)
.build()
return reformation.create(T::class.java)
}

我通过如下更改代码解决了问题

 private fun initViewModel() {
        viewModel.sportList.observe(this, Observer { result ->

            when (result) {
                is Results.Success -> {
                    val newList = result.data
                    if (newList != null) {
                        topHeadlinesAdapter.updateData(newList)
                    }
                    binding.recyclerView.adapter = topHeadlinesAdapter
                    topHeadlinesAdapter.notifyDataSetChanged()
                }
            }
        })

        viewModel.showLoading.observe(this, Observer { showLoading ->
            pb.visibility = if (showLoading) View.VISIBLE else View.GONE
        })

        viewModel.loadNews()
    }

你的回收器视图的可见性如何?它是否在布局中始终可见?你的进度条是否在响应后隐藏?嗨,Antonio数据根本不显示,只是进度条加载我认为响应问题或存储库或MainViewModel.kt中有问题。你的建议是什么我已检查并放置断点数据coming therehi Pawen可能你认为我的问题与改造有关我在网络模型中使用了koin,可能你需要网络类是的,在网络类中你必须使用这个..@EdgarShvedskiyHi Pawen Soni,我已经发布了KoinNetworkModule你能检查一下吗现在请检查我的答案。你可以使用相同的代码。修改了你的代码。
 private fun initViewModel() {
        viewModel.sportList.observe(this, Observer { result ->

            when (result) {
                is Results.Success -> {
                    val newList = result.data
                    if (newList != null) {
                        topHeadlinesAdapter.updateData(newList)
                    }
                    binding.recyclerView.adapter = topHeadlinesAdapter
                    topHeadlinesAdapter.notifyDataSetChanged()
                }
            }
        })

        viewModel.showLoading.observe(this, Observer { showLoading ->
            pb.visibility = if (showLoading) View.VISIBLE else View.GONE
        })

        viewModel.loadNews()
    }