我有一个具有一组操作的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,从而将结果适当地传播回用户。
我对此很陌生,无法真正掌握概念。如果有人可以解释一个例子,那会有所帮助。
答案 0 :(得分:0)
在Android中,有很多方法可以像您描述的那样完成异步工作。如果您正在使用Retrofit库处理网络请求,则可以使用Service和Loader,因为它内置了异步请求,因此请遵循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
}
});
}
});