解决方法一:使用ViewModel和Repository
class MyViewModel(private val repository: MyRepository) : ViewModel() {
private val _data = MutableLiveData()
val data: LiveData get() = _data
fun fetchData() {
viewModelScope.launch {
val result = repository.getData()
_data.postValue(result)
}
}
}
class MyRepository {
suspend fun getData(): String {
// 执行网络请求或数据库查询
return "Hello, World!"
}
}
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val repository = MyRepository()
val viewModelFactory = MyViewModelFactory(repository)
viewModel = ViewModelProvider(this, viewModelFactory).get(MyViewModel::class.java)
viewModel.data.observe(this, Observer { data ->
// 更新UI
textView.text = data
})
viewModel.fetchData()
}
}
解决方法二:绑定到Service/IntentService
class MyService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// 执行耗时操作并发送广播或回调通知界面更新
val data = "Hello, World!"
val intent = Intent("com.example.MY_ACTION")
intent.putExtra("data", data)
sendBroadcast(intent)
return super.onStartCommand(intent, flags, startId)
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
}
class MyActivity : AppCompatActivity() {
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val data = intent?.getStringExtra("data")
// 更新UI
textView.text = data
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this, MyService::class.java)
startService(intent)
val filter = IntentFilter("com.example.MY_ACTION")
registerReceiver(receiver, filter)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(receiver)
}
}
以上是两种解决方案的示例代码,您可以根据自己的需求选择其中一种或结合使用。ViewModel和Repository适用于需要在界面和数据之间进行解耦的情况,而绑定到Service/IntentService适用于需要在后台执行耗时操作并通知界面更新的情况。