这些天我正在尝试 Android Java 中的 Socket.IO 实现。我在 Google 上找到了一个 2 年前的样本。查看他的源代码后我发现他使用了 android.support.v4.content.Loader<D>
他记录的原因是:
we are using a Loader to manage the socket to make it persisted across Activity instances that happen when rotating.
我的第一个问题是我不明白这个说法。这是否意味着当设备旋转时它将创建不同的 Activity 实例?这是正确的吗?
在 Android 文档中 link其中提到:
Used to write apps that run on platforms prior to Android 3.0. When running on Android 3.0 or above, this implementation is still used; it does not try to switch to the framework's implementation.
再次不清楚...:(
他已连接到 Loader
的onForceLoad()
并在 onReset()
中断开连接方法。
我的另一个问题是,我应该使用它还是有其他更好的方法(从它诞生 2 年来)?
最佳答案
- 在轮换(以及其他一些事件)时, Activity 会被销毁并重新创建。这就是 Android 的工作原理。
- 另一件事只是说,如果您将 v4.loader 放入代码中,即使在较新的设备上运行,它也会使用 v4。这里没什么好担心的。
- 是的,那是 2 岁了。 Loader 的创建是为了尝试解决一个问题,并且只是创建了更多问题。我不建议任何人使用它。
如果您只需要在 1 个 Activity 中使用套接字,我推荐的是架构组件中的 ViewModel。
为此,您可以将此依赖项添加到您的 gradle 文件中:
implementation "android.arch.lifecycle:viewmodel:1.1.0"
然后创建 ViewModel 来保存套接字:
public class SocketViewModel extends AndroidViewModel {
public SocketViewModel(Application app) {
// add here code to start/open/initialise the socket
}
@Override public void onCleared() {
// add here code to close/finialse the socket
}
// create a get() or some other method to interface your Activity to your socket code
}
最后在您的 Activity 上调用此方法来获取 ViewModel:
private SocketViewModel socketModel;
@Override public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
... your view init ...
socketModel = ViewModelProviders.of(this).get(SocketViewModel.class);
}
这将使您的套接字在旋转时不会出现问题。
关于java - v4内容加载器的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48474626/