1

可能重复:
Android 服务使 Activity 没有响应

我使用服务在数据库和视图之间同步数据。但是服务不能正常工作,每当我使用服务来处理长任务时,视图停止响应(我不能在 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);

请给我解决方案。提前致谢!

4

3 回答 3

1

阅读有关服务的文档,特别是“什么是服务?” 段落。该服务在主 UI 线程上运行。看看AsyncTask,应该可以解决您的问题。这里的工作是在后台线程中完成的,并将结果发送回 UI 线程。

于 2012-06-11T21:07:29.150 回答
1

虽然其他人给出了一些回应,但我不知道是否强调了要点:虽然 aService听起来像是会在后台自动运行的东西,但它没有。它只是一段无需维护 UI 即可对意图做出反应的代码。但是,UI 线程仍然为 Service 进行处理。

相比之下,它看起来就像您想要的那样,Service位于后台并在后台线程中执行一些工作。您将使用Service 类来生成一个新线程,这通常是在响应您可以定义的某些意图时完成的(通常在您的onStart()或类似的东西中)。您可能会启动一个新线程,该线程实际上执行更新数据库等工作,并使用您的主服务来协调该线程。

由于看起来您还想与服务通信,因此您必须实现一个适当的Messenger配对Handler来跟踪您在 UI 和服务之间传递的消息(协调后台线程),以及(可能)某种方式(也可能是服务和后台线程之间协调的信使。

正如其他人所指出的,您还可以使用AsyncTask在 UI 线程上执行操作并“无缝”使用后台线程。

于 2012-06-11T22:28:24.160 回答
0

Android 在一段时间后关闭服务以节省资源。但是,您可以使用类似的东西来防止这种情况发生

int onStartCommand(Intent, int, int){
return START_STICKY;
}

参考这个

于 2012-05-18T05:32:43.127 回答