gar*_*h0p 4 java android android-service android-networking
我正在开发一款需要维护与聊天服务器的网络连接的Android应用.我知道我可以创建一个服务来启动与服务器的连接,但是服务如何通知Android Activity新的传入消息?活动需要更新视图以显示新消息.我对Android很新,所以任何帮助都表示赞赏.谢谢!
你能把处理程序传递给你的服务吗?
首先,将处理程序定义为接口.这是一个例子,所以你的可能会更复杂.
public interface ServerResponseHandler {
public void success(Message[] msgs); // msgs may be null if no new messages
public void error();
}
Run Code Online (Sandbox Code Playgroud)
在您的活动中定义处理程序的实例.由于它是一个接口,您将在活动中提供实现,因此您可以在处理程序中引用封闭活动的字段和方法.
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);
}
Run Code Online (Sandbox Code Playgroud)
和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();
}
}
Run Code Online (Sandbox Code Playgroud)
此外,正如Aleadam所说,你也应该离开默认情况下服务在同一个线程上运行.对于像网络这样的东西,这通常不是首选行为.服务上的Android Fundamentals页面明确警告网络没有单独的线程:
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定).这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作.通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互.
有关在您的服务中使用线程的更多信息,请查看SO文章应用程序线程与服务线程以及如何在android中的新线程中启动服务
您是否检查了服务 API 页面:http://developer.android.com/reference/android/app/Service.html?
它有几个关于如何与服务交互的示例。
该服务与 Activity 运行在同一线程和同一上下文上。另请检查此处:http://developer.android.com/reference/android/content/Context.html#bindService%28android.content.Intent,%20android.content.ServiceConnection,%20int%29
最后,请看一下 Lars Vogel 的文章:http://www.vogella.de/articles/AndroidServices/article.html