2012-10-19 46 views
0

你好,我有一个意向为低于UI冻结启动的服务安卓:当意图调用服务

public void startAlarmService() { 
    Intent i = new Intent(); 
    i.setAction("me.application.AlarmService"); 
    startService(i); 
} 

当复选框被选中时调用此方法。但是,当它被检查,UI冻结了5秒钟..

我试图通过运行一个新的线程,然后通过使用AsyncTask调用上述方法,但都没有工作,它也花了5因为例如我放置了一个进度对话框,并且在显示进度对话框之前UI冻结了。

如何确保在启动此服务时UI不会冻结?

谢谢你的帮助。

编辑:服务代码:使用异步任务下载部分:

asyncDownload aCall = new asyncDownload(getApplicationContext(),this);    
boolean result = aCall.execute().get(); 
return result; 
+0

有没有一个有效的服务来处理这个名字的操作? – Egor

+0

当然,服务按预期运行。 – user1433460

+0

你在这项服务中究竟做了什么? “服务”类的扩展在主UI线程上运行。 – Luksprog

回答

0

您首先创建AsyncTask,然后使用它的get()方法阻止主线程。正确地执行 - 在doInBackground(Params...)后台工作,然后更新在onPostExecute(Result)中的UI,该UI在主线程中再次调用 - 而不是使用get()

+0

如果我删除了get(),它可以很好地工作。谢谢。但是,你能告诉我如何从asyncTask获得结果值,如果不是通过获取服务?我需要知道服务中的asyncTask的结果。我需要的值,所以我知道如果asyncTask成功下载图像。如果没有,我需要重置警报服务。我是否必须重置OnPostExecute中的警报服务? – user1433460

1

默认情况下,同一个线程在同一应用程序的活动上的服务运行,即UI线程。
因此,在新线程中运行您的服务看起来是一个很好的解决方案。

+0

确切地说,我认为问题不是在主线程中解雇服务本身(上面的行),而是事实上,服务使用它创建的线程在默认情况下 - 所以服务实施。 –

+0

但我使用asyncTask来完成所有的工作。不是asyncTask也是正确的事情吗?此外,我尝试通过运行一个新线程来调用服务,但也冻结了UI @FenixVoltres – user1433460

+0

是的,一个AsyncTask的onExecute在一个单独的线程中运行,但我不知道你的服务在AsyncTask之外做什么。我只是指出最可能出现的问题。 简单的测试来确认/体弱。创建一个只做Log.d的新服务(“TAG”,“创建服务”); 并用这个替换你的服务。 – Teovald