我的应用程序中运行了一个服务..
此服务有一个对象,用于向服务器发送消息以及获取该对象并使用它的函数。
该对象是从服务初始化的,但是当UI获取此对象并使用它时 - 看起来它在UI线程上使用它。
这是对的吗?有没有办法让我的对象始终从服务线程运行?
public class ServerMessagesManager extends Service {
private ServerMessagesReceiver serverMessageReceiver;
@Override
public void onCreate() {
super.onCreate();
this.serverMessageReceiver = new ServerMessagesReceiver(app);
}
public ServerMessagesReceiver getServerMessagesReceiver()
{
return serverMessageReceiver;
}
}
答案 0 :(得分:27)
使用IntentService
代替Service
。如果您在Service
中进行网络通话,则用户界面会停滞不前。因此,请使用IntentService
,因为它使用单独的Thread
。
您不知道服务器消息何时将检索数据。只要网络调用仍在进行中,只要访问了对象,就可以抛出NullPointerException
。每当服务器响应时,使用BroadcastReceiver
来触发Intent
。
答案 1 :(得分:5)
据我所知,Android服务在UI线程上运行。如果要进行异步作业,则应使用Intent Service
看到:
What is the difference between an IntentService and a Service?
这是你可以尝试的Intent service example。