我做了一個 RecyclerView。初始資料是使用來自 web-API 的 Retrofit 加載的。由于缺少,這是從服務器加載資料引起的,初始視圖是空的。
目前我有一個 Thread.sleep() 用于延遲對 Recycler-View 配接器的資料分配。然后它按預期作業。請在代碼中查看我的評論。
我怎樣才能擺脫睡眠的骯臟把戲?這是如何正確完成的?
主要活動:
class MainActivity : AppCompatActivity() {
val TAG = MainActivity::class.java.simpleName
lateinit var recyclerView: RecyclerView
lateinit var addContactFab: FloatingActionButton
lateinit var viewModel: ContactsViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
addContactFab = findViewById(R.id.addContactFab)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
viewModel = ViewModelProvider(this).get(ContactsViewModel::class.java)
// -- How can I get rid of this? ---
Thread.sleep(1000)
// ---------------------------------
recyclerView.adapter = ContactAdapter(viewModel.contactsList)
addContactFab.setOnClickListener {
val contact = Contact(id = System.currentTimeMillis(),
name = "Test Name", email = "Test Email", phone = "${System.currentTimeMillis()}")
viewModel.contactsList.add(contact)
recyclerView.adapter = ContactAdapter(viewModel.contactsList)
}
}
}
ViewModel 類:
class ContactsViewModel: ViewModel() {
val TAG = this::class.java.simpleName
var contactsList = ArrayList<Contact>()
init {
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://jsonplaceholder.typicode.com")
.build()
val service = retrofit.create(ApiInterface::class.java)
val call = service.getContacts()
call.enqueue(object : Callback<List<Contact>> {
override fun onResponse(call: Call<List<Contact>>, response: Response<List<Contact>>) {
if (response.code() == 200) {
val contacts = response.body()
contacts?.forEach {
contactsList.add(Contact(
id = it.id,
name = it.name,
email = it.email,
phone = it.phone))
}
}
}
override fun onFailure(call: Call<List<Contact>>, t: Throwable) {
Log.d(TAG, "onFailure: ${t.localizedMessage}")
}
})
}
}
uj5u.com熱心網友回復:
您無法擺脫呼叫 API 的“等待時間”。實際上,休眠 UIThread 或給它太多處理是一種非常糟糕的做法。更糟糕的是,您的 API 可能需要 5 秒才能加載資料,并且表現得像沒有資料一樣。
更好的方法是在訪問活動之前加載(因此您向用戶顯示一個進度條,告訴他在啟動活動之前資料正在加載)或者您可以在您的實際活動中顯示一個進度條(而不是 RecyclerView例如)。然后一旦你的資料被加載(onSuccess),你可以洗掉/隱藏你的progressBar來設定配接器,或者呼叫setData(這取決于你想要什么)
不要忘記處理 onFailure 場景的場景案例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/451754.html
上一篇:關于Alpine.js中的異步