Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Kotlin:异步调用后如何更新recyclerView?从错误线程异常获取CalledFromErrorThreadException_Java_Android_Asynchronous_Kotlin_Android Recyclerview - Fatal编程技术网

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观察到的
    MutableLiveData
    ,因为这样UI将在主应用程序线程上获得更新
  • 使用现有的配方
runOnUiThread(new Runnable() {

@Override
public void run() {
    //update your UI
    }
});