首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以让bindService()阻塞吗?

可以让bindService()阻塞吗?
EN

Stack Overflow用户
提问于 2011-06-25 02:43:58
回答 5查看 16K关注 0票数 13

我有一个使用远程服务的安卓应用程序,我用bindService()绑定到它,这是异步的。

在绑定服务之前,应用程序是无用的,所以我想简单地等待,直到绑定完成,然后再启动任何活动。有没有办法在调用onCreate()onResume()之前绑定服务?我认为也许有一种方法可以在Application中完成绑定。有什么想法吗?

编辑:

如果在onCreate()中,我这样做。

代码语言:javascript
复制
bindService(service, mWebServiceConnection, BIND_AUTO_CREATE);
synchronized (mLock) { mLock.wait(40000); }

ServiceConnection.onServiceConnected在40秒内不会被调用。很明显,如果我想要绑定服务,就必须让onCreate()返回。

所以看起来没有办法做我想做的事。

编辑2:在绑定服务时,Android how do I wait until a service is actually connected?对安卓中发生的事情有一些很好的评论。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-25 02:49:31

您不能使用bindService()块。但是,您的ServiceConnection (bindService的第二个参数)有回调来告诉您服务何时连接和断开,因此您可以使用其他代码块,直到您的onServiceConnected()方法取消阻塞它。

票数 6
EN

Stack Overflow用户

发布于 2014-03-03 06:39:59

当我需要在做其他事情之前等待服务被绑定时,我会使用锁。确切地说,ServiceConnection拥有一个锁对象,并公开一个waitUntilConnected方法,该方法在锁上阻塞,直到出现唤醒信号。该通知位于onServiceConnected回调中。

代码语言:javascript
复制
public class MyServiceConnection implements ServiceConnection {

    private volatile boolean connected = false;
    private Object lock = new Object();

    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        connected = true;

        synchronized (lock) {
            lock.notifyAll();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        connected = false;
    }

    public void waitUntilConnected() throws InterruptedException {
        if (!connected) {
            synchronized (lock) {
                lock.wait();
            }
        }
    }

}

因此,例如,如果一个活动必须等待服务被绑定,它只调用waitUntilConnected方法。

代码语言:javascript
复制
protected void onStart() {
    super.onStart();

    bindService(myServiceIntent, myServiceConnection, Context.BIND_AUTO_CREATE);
    try {
        myServiceConnection.waitUntilConnected();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

我只是将waitUntilConnected方法放在onStart中作为示例,但是必须在不同的线程中调用它。我想听到一个更优雅的方式!:)

票数 6
EN

Stack Overflow用户

发布于 2013-04-08 17:32:33

似乎有一种方法可以做到这一点。KeyChain.java和几个谷歌编写的类使用LinkedBlockingQueue来允许同步绑定到服务。

例如,请参阅https://github.com/android/platform_frameworks_base/blob/master/keystore/java/android/security/KeyChain.java上名为bind的方法

由于阻塞队列的使用,它似乎会同步返回服务对象。

不幸的是,正如Android文档https://developer.android.com/reference/android/security/KeyChain.html中所述,一些方法会抛出InterruptedException,这是因为从队列中获取元素可能会在等待时被中断。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6472345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档