我使用服务来同步数据库和视图之间的数据。但是服务不能正常工作,每当我使用服务来完成长任务时,视图停止响应(我不能在UI中做任何事件)而且我必须等待服务已经完成。这是我的服务:
public class SyncService extends Service{
private static final String TAG = "SyncService";
@Override
public void onCreate()
{
super.onCreate();
}
@Override
public void onDestroy()
{
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent)
{
Log.d(TAG, "call onBind");
return new DataManagerBinder();
}
private class DataManagerBinder extends Binder implements IUserDataManager
{
@Override
public void doProcess(Activity mView)
{
//do some long task (not touch UI thread)
// this will cause the view not response
syncDB();
// update view after process completed
mView.updateViewOnComplete();
}
}
我尝试在客户端活动中绑定此服务
//the interface to handle binder
IUserDataManager viewManager = null;
ServiceConnection serviceConnection = new ServiceConnection()
{
@Override
public void onServiceDisconnected(ComponentName name)
{
Log.i(TAG, "connection closed unexpectedly");
viewManager = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder binder)
{
Log.d(TAG, "serviceConnection onServiceConnected");
viewManager = (IUserDataManager) binder;
viewManager.doProcess(MyActivity.this);
}
};
Intent intent = new Intent(MyActivity.this, SyncService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
请给我解决方案。提前谢谢!
答案 0 :(得分:1)
答案 1 :(得分:1)
虽然其他人已作出一些回应,但我不知道是否强调了重点:
虽然Service
听起来像会在后台自动运行,但不是。它只是一段代码,可以在不维护UI的情况下对意图做出反应。但是,UI线程仍然处理服务。
相比之下,它看起来像你想要的,是坐在背景中的Service
,并且在后台线程中有些工作。您将使用 Service类来生成新线程,这通常是在响应某些意图时完成的,您可以定义该意图(通常在您的onStart()
或类似内容中)。您可能会启动一个新线程,它实际上会更新数据库等工作,并使用您的主服务来协调该线程。
由于您似乎 希望与服务进行通信,因此您必须实施适当的Messenger
和Handler
对来跟踪您之间传递的消息UI和服务(协调后台线程),以及(可能)某种方式(也许是信使)在服务和后台线程之间进行协调。
正如其他人所说,您还可以使用AsyncTask
在UI线程上执行操作,并“无缝地”使用后台线程。
答案 2 :(得分:0)
Android会在一段时间后关闭服务以节省资源。 但是,您可以使用
之类的东西来防止这种情况发生int onStartCommand(Intent, int, int){
return START_STICKY;
}
ref this