Java Android Kotlin:异步调用后如何更新recyclerView?从错误线程异常获取CalledFromErrorThreadException
我正在尝试执行异步调用,然后更新Java Android Kotlin:异步调用后如何更新recyclerView?从错误线程异常获取CalledFromErrorThreadException,java,android,asynchronous,kotlin,android-recyclerview,Java,Android,Asynchronous,Kotlin,Android Recyclerview,我正在尝试执行异步调用,然后更新RecyclerView。很像这个问题中概述的: 但是,当我尝试执行此操作时,会出现以下错误: android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。 这是我的代码(主要问题在于setAlbums函数): 类AlbumActivity:AppCompatActivity(){ 受保护的lateinit变量适配器:MyRecycleServiceAdapter
RecyclerView
。很像这个问题中概述的:
但是,当我尝试执行此操作时,会出现以下错误:
android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
这是我的代码(主要问题在于setAlbums函数):
类AlbumActivity:AppCompatActivity(){
受保护的lateinit变量适配器:MyRecycleServiceAdapter
受保护的lateinit变量recyclerView:recyclerView
var animalNames=listOf(“无”)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u相册)
recyclerView=findViewById(R.id.rvAnimals)
recyclerView.layoutManager=LinearLayoutManager(此)
adapter=MyRecycleServiceAdapter(这是animalNames)
recyclerView.adapter=适配器
urlCall(“https://rss.itunes.apple.com/api/v1/us/apple-music/coming-soon/all/10/explicit.json")
}
私人趣味urlCall(url:String){
val client=OkHttpClient()
val request=request.Builder().url(url.build())
client.newCall(请求).enqueue(对象:回调{
重写失败(call:call,e:IOException){}
override-fun-onResponse(call:call,response:response)=getJSON(response.body()?.string())
})
}
有趣的getJSON(数据:字符串?){
val gson=gson()
val allAlbums=ArrayList()
val jsonResponse=JSONObject(数据)
val feed=jsonResponse.getJSONObject(“feed”)
val albums=feed.getJSONArray(“结果”)
for(在albums.length()之前的0中的i){
val album=albums.getJSONObject(i)
add(gson.fromJson(album.toString(),album::class.java))
}
设置相册(所有相册)
}
fun setAlbums(专辑:ArrayList){
动物名称=列表(“苏”、“贝琪”)
adapter.notifyDataSetChanged()//这是我告诉适配器数据已更改的地方
}
内部类相册{
变量artistName:字符串?=null
变量名称:字符串?=null
}
}
有人知道我遇到的问题吗?您需要在主线程上执行想要的代码,如下所示:
runOnUiThread(new Runnable() {
@Override
public void run() {
//update your UI
}
});
您的
回调
函数将在后台线程上调用。在某种程度上,这是因为OkHttp不是一个特定于Android的库,所以它不知道Android的主应用程序线程
您需要做一些事情来更新主应用程序线程中的UI。现代选择包括:
- 让您的
更新UI观察到的回调
,因为这样UI将在主应用程序线程上获得更新MutableLiveData
- 使用现有的配方
runOnUiThread(new Runnable() {
@Override
public void run() {
//update your UI
}
});