Java 使用Android服务处理网络连接
我正在开发一款Android应用程序,它需要与聊天服务器保持网络连接。我知道我可以创建一个服务来启动与服务器的连接,但是该服务如何通知Android活动新的传入消息?活动需要更新视图以显示新消息。我对安卓相当陌生,所以非常感谢您的帮助。谢谢 您是否查看了服务API页面:?Java 使用Android服务处理网络连接,java,android,android-service,android-networking,Java,Android,Android Service,Android Networking,我正在开发一款Android应用程序,它需要与聊天服务器保持网络连接。我知道我可以创建一个服务来启动与服务器的连接,但是该服务如何通知Android活动新的传入消息?活动需要更新视图以显示新消息。我对安卓相当陌生,所以非常感谢您的帮助。谢谢 您是否查看了服务API页面:? 它有几个关于如何与服务交互的示例 服务与活动在同一线程和同一上下文上运行。请在此查看: 最后,再看看Lars Vogel的文章:你能把处理程序传递给你的服务吗 首先,将处理程序定义为接口。这是一个例子,所以你的可能更复杂 pu
它有几个关于如何与服务交互的示例 服务与活动在同一线程和同一上下文上运行。请在此查看:
最后,再看看Lars Vogel的文章:你能把处理程序传递给你的服务吗 首先,将处理程序定义为接口。这是一个例子,所以你的可能更复杂
public interface ServerResponseHandler {
public void success(Message[] msgs); // msgs may be null if no new messages
public void error();
}
在活动中定义处理程序的实例。由于它是一个接口,您将在活动中提供实现,因此您可以从处理程序中引用封闭活动的字段和方法
public class YourActivity extends Activity {
// ... class implementation here ...
updateUI() {
// TODO: UI update work here
}
ServerResponseHandler callback = new ServerResponseHandler() {
@Override
public void success(Message[] msgs) {
// TODO: update UI with messages from msgs[]
YourActivity.this.updateUI();
}
@Override
public void error() {
// TODO: show error dialog here? (or handle error differently)
}
}
void onCheckForMessages() {
networkService.checkForMessages(callback);
}
NetworkService将包含以下内容:
void checkForMessages(ServerResponseHandler callback) {
// TODO: contact server, check for new messages here
// call back to UI
if (successful) {
callback.success(msgs);
} else {
callback.error();
}
}
此外,正如Aleadam所说,您还应该注意,默认情况下服务运行在同一线程上。对于网络之类的东西,这通常不是首选行为。明确警告不要在没有单独线程的情况下联网:
警告:服务在其宿主进程的主线程中运行,但服务没有
创建自己的线程,并且不在单独的进程中运行(除非您指定
否则)。这意味着,如果您的服务要执行CPU密集型工作或
阻止操作(如MP3播放或联网),应创建新线程
在服务范围内完成该工作。通过使用单独的线程,您将减少
应用程序不响应(ANR)错误的风险,应用程序的主线程可以继续专用于用户与您的活动的交互
有关在服务中使用线程的更多信息,请参阅SO文章和一种常见且有用的方法是在活动中注册广播接收器,并让服务在有有用数据时发送通知事件。我发现这比通过回调实现处理程序更容易管理,主要是因为当配置发生更改时,它更容易、更安全。如果您将一个直接的活动引用传递给服务,那么当活动被破坏时(在旋转期间或后台),您必须非常小心地将其清除,否则会导致泄漏 使用广播接收器,当活动被销毁时,您仍然必须取消注册,但是该服务从未直接引用该活动,因此如果您忘记了该活动,则不会泄漏。创建主题时,让活动注册器收听主题也更容易,因为它不必获得对服务的直接引用 Lars Vogel的文章讨论了这种方法,它绝对值得一读