android.os.NetworkOnMainThreadException

android.os.NetworkOnMainThreadException是一个在Android中常见的异常,它发生在你尝试在主线程(UI线程)上进行网络操作时。Android系统不允许在主线程上执行长时间运行的操作,包括网络请求,因为这可能会导致应用界面冻结或响应不佳。

解决这个问题的方法是将网络操作移动到工作线程(非UI线程)中。有几种方式可以实现:

  1. 使用AsyncTaskAsyncTask是一种简单的方式来在后台线程中执行任务,并在主线程上更新UI。
class GetMessagesTask : AsyncTask<Void, Void, List<Message>>() {
    override fun doInBackground(vararg voids: Void?): List<Message> {
        val retrofit = Retrofit.Builder()
           .baseUrl("http://10.3.161.91:8085/messages/")
           .addConverterFactory(GsonConverterFactory.create())
           .build()

        val apiService = retrofit.create(ApiService::class.java)
        val response = apiService.getMessages().execute()
        return if (response.isSuccessful) {
            response.body()?: emptyList()
        } else {
            throw IOException("Failed to retrieve messages")
        }
    }

    override fun onPostExecute(result: List<Message>?) {
        super.onPostExecute(result)
        // 在主线程上更新UI
        if (result!= null) {
            // 处理成功的响应
        } else {
            // 处理失败的响应
        }
    }
}
  1. 使用CoroutinesCoroutines是Kotlin提供的一种更现代的异步编程方式,可以用来执行网络请求。
GlobalScope.launch(Dispatchers.IO) {
    try {
        val retrofit = Retrofit.Builder()
           .baseUrl("http://10.3.161.91:8085/messages/")
           .addConverterFactory(GsonConverterFactory.create())
           .build()

        val apiService = retrofit.create(ApiService::class.java)
        val response = apiService.getMessages().execute()
        if (response.isSuccessful) {
            withContext(Dispatchers.Main) {
                // 在主线程上更新UI
            }
        } else {
            throw IOException("Failed to retrieve messages")
        }
    } catch (e: Exception) {
        // 在主线程上处理异常
    }
}
  1. 使用Retrofit的Call.enqueue()方法:Retrofit提供了一个Call.enqueue()方法,可以在后台线程中执行网络请求,并在主线程上处理响应。
val retrofit = Retrofit.Builder()
   .baseUrl("http://10.3.161.91:8085/messages/")
   .addConverterFactory(GsonConverterFactory.create())
   .build()

val apiService = retrofit.create(ApiService::class.java)
apiService.getMessages().enqueue(object : Callback<List<Message>> {
    override fun onResponse(call: Call<List<Message>>, response: Response<List<Message>>) {
        if (response.isSuccessful) {
            // 在主线程上处理成功的响应
        } else {
            // 在主线程上处理失败的响应
        }
    }

    override fun onFailure(call: Call<List<Message>>, t: Throwable) {
        // 在主线程上处理异常
    }
})

无论使用哪种方法,都要确保在非UI线程中执行网络请求,并在主线程上更新UI。这样可以避免NetworkOnMainThreadException并提高应用的性能和用户体验。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值