【问题标题】:Retrofit + Android Annotations cancel/stop requests + stop threads改造 + Android 注释取消/停止请求 + 停止线程
【发布时间】:2015-08-17 11:04:04
【问题描述】:

我在我的项目中使用 Android 注释。

我正在后台线程中执行一组任务。每个后台线程都包含对 REST 端点的调用(使用 Retrofit)。此时所有调用都是同步的。如果我离开应用程序(在片段的 onDestroy 中),我试图取消所有线程。

我的代码结构是这样的

@Background
void bgMethod1(){
//call rest endpoint get response
uiThread1(response)
}

@UiThread
void uiThread1(){
some UI related changes = show toasts etc
bgMethod2();
}

@Background
void bgMethod2()
//call next rest endpoint get response
uiThread2(response)
}

 @UiThread
void uiThread2(){
some UI related changes = show toasts etc
bgMethod3();
}

依此类推……在这些线程运行的任何时候,如果我退出应用程序(按后退按钮),我想停止所有这些线程的运行(也停止当前的 REST 调用就像所有未来的电话一样)

我目前指的是这个 github 页面的 Android 注释

https://github.com/excilys/androidannotations/wiki/WorkingWithThreads

我曾尝试使用 Fragment 的 BackgroundExecutor.cancelAll inonDestroy 无济于事。所有方法都执行(所有 REST 调用都是按顺序进行的)。

如何停止所有线程的执行/取消以及停止由 Retrofit 在这些线程中发出的请求,包括正在进行的和将来的请求。

我的 Retrofit REST 接口中的所有方法都是同步的并且有一个返回类型。

【问题讨论】:

    标签: android multithreading retrofit android-annotations


    【解决方案1】:

    首先,您应该在注释中添加取消标识符。

    @Background(id = "someId")
    void bgMethod1(){
      //call rest endpoint get response
      uiThread1(response)
    }
    

    如果你想中断已经运行的请求,你可以这样做:

    BackgroundExecutor.cancelAll("someId", true)
    

    但是,这可能会导致对您的服务器的请求过时...

    【讨论】:

    • 好吧,如果一个任务已经在执行,它将interrupt线程。这并不意味着线程将停止。如果任务还没有开始,肯定会被清除执行。
    猜你喜欢
    • 2011-12-26
    • 2010-10-30
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多