我有一个应用程序,其中活动(MainActivity.java
)创建了一个Java类(Algo.java
)的对象,该类应该执行一些DataBase条目,然后这个类必须与服务(ActionService.java
)传递对象。
为此,在Algo的构造函数中,我调用context.bindService()
,但是服务的onBind不会立即调用,但是bindService()
返回true
,Algo执行它的数据库条目当它的工作完成并准备调用服务方法时,它仍然将mBound
变量设为null(在方法publishToActionService
中),但在此之后调用onBound()
方法和随后的onServiceConnected()
,现在我环顾四周,发现它是一个异步调用,但有没有办法确保在代码中的任何其他执行之前调用onBound。
代码说明如下:
public Algo(Context context){
this.context = context;
this.dbh = DBHelper.getInstance(context);
Intent intent = new Intent(context, ActionService.class);
boolean b = context.getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
//method to make DB calls
//---
private void publishToActionService(HackBotEvent hackBotEvent){
if((hackBotEvent != null) && (hackBotEvent.getIsLearned() != -1) && (mBound))
{
mService.fillListenedEventList(hackBotEvent);
}
}
private static ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
Log.d(LOG,"in onServiceConnected, setting mBound true");
ActionService.LocalBinder binder = (ActionService.LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
Log.d(LOG,"in onServiceDisconnected, setting mBound false");
mBound = false;
}
};
MainActivity.java,这是Algo调用:
Algo algo = new Algo(this);
可以看到Algo.java类的整个代码here。
答案 0 :(得分:2)
您应该在活动的onStart()
方法中绑定您的服务,并在onStop()
中取消绑定。
您可以使用serviceBound(boolean)
这样的标记,您可以在onServiceConnected
和onServiceDisconnected
回调方法中设置为true或false。
修改强>
您不应该将您的服务绑定到广播接收器, 请查看链接this和this
您应该将startService
方法的意图传递给BroadcastReceiver
,并从服务的onStartCommand
方法执行任务。
答案 1 :(得分:1)
几个选项,
在Algo
中,添加一个回调,例如onReady(),
protected abstract void onReady();
绑定到服务时调用此方法。在任何使用Algo
中,实现该方法,并且在获得onReady()回调之前不要回调Algo
来启动任何数据库操作。
Algo
之外绑定,无论是托管该类的任何内容(Activity
,Service
还是Application
)。绑定后,将服务绑定器传递给Algo
的构造函数,以便它可以立即使用它。