1

我有一个具有一组操作的 android 服务:

我的服务.java

public class MyService extends Service {

    public int login() {
      //Invokes yet another logic to initiate login and waits for result 
      //synchronously and returns status code based on result of operation
    }

    public int logout() {
      //Invokes yet another logic to initiate logout and waits for result 
      //synchronously and returns the status code
    }
}

我正在调用来自客户端活动的方法,例如,MyClientActivity.java驻留在同一进程中。

对于每个操作,服务调用一些逻辑并以同步方式等待结果。当服务正在执行所有这些逻辑时,我不希望用户执行任何其他操作而只显示加载屏幕。所以基本上,在我启动一个操作后,我想MyClientActivity同步等待状态码。现在我知道我不能阻止 UI 线程来避免 ANR。
如何使此操作在单独的线程上执行,然后返回结果,以便我可以通过基于此结果更改 UI 将结果适当地传播回用户。

我对此很陌生,无法真正掌握这些概念。如果有人可以解释一个会有帮助的例子。

4

2 回答 2

1

在 Android 中,有很多方法可以像您描述的那样进行异步工作。如果您使用 Retrofit 库进行网络请求,则可以使用ServiceLoader,而不是内置异步请求,因此请遵循文档。此外,还有 RxJava,但它的学习曲线相当陡峭。

于 2019-03-05T09:03:52.463 回答
0

我通过使用 aHandlerThread创建一个Handler我要发布Runnables的执行后台任务的 a 来实现这一点。
为了执行该主线程任务(UI 任务),我正在使用mainLooper创建另一个Handler我发布的内容Runnables来对视图进行操作。
代码的粗略表示:

mBackgroundHandler.post(new Runnable() {

    @Override
    public void run() {
        //Do background operation in synchronous manner as usual.

    mMainHandler.post(new Runnable() {
        @Override
        public void run() {
            //Remove loader, update UI
        }
    });
  }
});
于 2019-03-25T05:50:09.477 回答