在服务中同步执行长时间运行的方法

时间:2019-03-05 08:12:10

标签: java android multithreading android-service worker-thread

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

MyService.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,从而将结果适当地传播回用户。

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

2 个答案:

答案 0 :(得分:0)

在Android中,有很多方法可以像您描述的那样完成异步工作。如果您正在使用Retrofit库处理网络请求,则可以使用ServiceLoader,因为它内置了异步请求,因此请遵循documentation。另外,还有RxJava,但是它的学习曲线相当陡峭。

答案 1 :(得分:0)

我通过使用HandlerThread创建了一个Handler并将其发布到Runnables来执行后台任务的方法来实现了这一目标。
要执行这些主线程任务(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
        }
    });
  }
});