我正在尝试创建一个通过意图服务发出 HTTP 请求的应用程序。我需要应用程序等待服务完成其运行(即,让请求返回一些数据),然后再继续其操作,因为其操作涉及对我希望从 HTTP 请求接收的数据的操作。我已经尝试了多种方法 - Semaphore、CountDownLatch,但似乎对于所有这些方法,我需要某种方法将等待/计数对象传递到意图服务中,以便它可以告诉主线程该对象在哪里等待处理完成。我该如何去做呢?基本上,我想要对 http 服务器进行同步、阻塞调用,以方便地与意图服务一起工作,因为意图服务使多线程变得容易。
再次重申,只是为了确保我没有滥用术语:同步和阻塞的意思/我想要什么:我通过向发出请求的intentservice发送意图来调用http服务器。我的 UI 线程或发送此意图的线程现在会等待,直到处理完请求并返回结果,然后再继续运行。
如果您认为我正在执行的这个过程(以阻塞、同步的方式进行 http 调用)完全错误,那么您可能会选择什么其他方法来执行此操作?谢谢!
很抱歉,但我认为你的架构不正确,或者我可能理解错误。 IntentService 旨在在单独的线程上以串行方式执行操作。现在你说你希望它是同步和阻塞的。你不能阻塞 UI 线程!
为了创建从 IntentService 到 Activity/Fragment/等的通知系统。你有几个选择:单例,广播消息(接收者,resultReceiver),其他?
基于服务和应用程序的其他部分在同一进程中工作的假设。最好的选择是创建经理来完成这项工作。可以构建类似的东西来启动服务并监听完成事件:
public class MyNetworkManager {
static MyNetworkManager sInstance;
Context mContext;
LinkedList<OnCompletionListener> mListeners;
private MyNetworkManager(Context context) {
mContext = context;
mListeners = new LinkedList<>();
}
public static MyNetworkManager getInstance(Context context) {
if (sInstance == null) {
synchronized (MyNetworkManager.class) {
if (sInstance == null) {
sInstance = new MyNetworkManager(context.getApplicationContext());
}
}
}
return sInstance;
}
// add listener to listen for completion event
public void addListener(OnCompletionListener listener) {
synchronized (mListeners) {
mListeners.add(listener);
}
}
// remove listener to stop listening for completion event
public void removeListener(OnCompletionListener listener) {
synchronized (mListeners) {
mListeners.remove(listener);
}
}
// call from UI to start service operation
public void startNetworkOperation() {
Intent service = new Intent();
mContext.startService(service);
}
// call from service to notify UI (still on different thread, can use Handler to make call on main thread)
public void notifyCompletion() {
synchronized (mListeners) {
for (OnCompletionListener listener : mListeners) {
listener.onCompleted(this);
}
}
}
public static interface OnCompletionListener {
void onCompleted(MyNetworkManager manager);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)