【问题标题】:How to send parameters for get request using retrofit and kotlin Coroutines.?如何使用改造和 kotlin 协程发送获取请求的参数。?
【发布时间】:2019-10-09 06:14:02
【问题描述】:

我按照教程从 https://proandroiddev.com/suspend-what-youre-doing-retrofit-has-now-coroutines-support-c65bd09ba067。 我很难理解如何发送参数以从 MainActivity 获取请求

Webservice.kt

interface Webservice {
@GET("/todos/{id}")
suspend fun getTodo(@Path(value = "id") todoId: Int): Todo
}

TodoRepository.kt

class TodoRepository {
var client: Webservice = RetrofitClient.webservice
suspend fun getTodo(id: Int) = client.getTodo(id)
}

MainViewModel.kt

class MainViewModel : ViewModel() {
val repository: TodoRepository = TodoRepository()

val firstTodo = liveData(Dispatchers.IO) {
    val retrivedTodo = repository.getTodo(1)

    emit(retrivedTodo)
    }
}

MainAcitvity.kt

class MainActivity : AppCompatActivity() {

lateinit var viewModel: MainViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

    showFirstTodo()
}

private fun showFirstTodo() {
    viewModel.getFirstTodo().observe(this, Observer {
        titleTextView.text = it.title
    })
}
}

【问题讨论】:

    标签: android kotlin retrofit2 kotlin-coroutines


    【解决方案1】:

    您可以像这样更改 viewModel 代码

     private val _todo = MutableLiveData<Todo>()
     val todo : LiveData<Todo> get() =_todo
    
     //Call this method from activity
     fun getTodo(arg : Int)
     {
      val result = //Call Coroutines here
      _todo.postValue(result)
     }
    

    【讨论】:

    • 我做了这样的事情fun getTodo(arg : String):LiveData&lt;Response&lt;com.example.myapplication.entity.UserData&gt;&gt; { val result = liveData(Dispatchers.IO) { val retrivedTodo = repository.getTodo(arg) emit(retrivedTodo) } return result }这是正确的方法吗?
    • 如果你只想获得一次待办事项,那我想没关系....在待办事项刷新等条件下,这是不行的,因为你不能使用刚刚创建的实时数据
    【解决方案2】:

    PathQueryGET 请求中存在差异。
    您可以像这样轻松传递查询字符串:
    接口网络服务 {

    @GET("/todos/{id}")
    suspend fun getTodo(@Path(value = "id") todoId: Int, @Query("name") name: String?): Todo
    }
    

    【讨论】:

    • 我正在从 MainViewModel 发送一个常量值 1,我需要发送一个在 UI 文本框中输入的变量
    • 如何将多个参数传递给GET请求?
    • 如果您使用的是查询,
      suspend fun getTodo(@Query(value = "id") todoId: Int, @Query("name") name: String?): Todo 并且如果您使用的是路径方式
      suspend fun getTodo(@Path(value = "id") todoId: Int, @Path("name") name: String?): Todo
    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2020-10-08
    • 2019-06-17
    • 2020-01-21
    • 2019-10-05
    • 2022-01-15
    • 2022-08-19
    • 2021-06-04
    相关资源
    最近更新 更多