Android片段生命周期显示,当片段被添加到backstack然后被删除/替换时,将onDestroyView()被调用,稍后,当片段从backstack返回到布局时,将onCreateView()被调用.
根据我的理解,这意味着片段的视图正在被破坏和重新创建.如果用户EditText在片段A中输入文本并转到片段B然后再返回到A,则当片段返回时,其EditText内容将被删除.
但是,以下代码中没有发生这种情况; 谁能解释为什么?我已经验证了FragmentA的onDestroyView()被调用.

public class MainActivity extends FragmentActivity {
private Fragment currentFragment = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
addFragment(new FragmentA());
}
}
public void setCurrentFragment(Fragment fragment) {
this.currentFragment = fragment;
}
@Override
public void onBackPressed() {
if (currentFragment instanceof FragmentB) {
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
public void addFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit();
setCurrentFragment(fragment);
} …Run Code Online (Sandbox Code Playgroud) 人们常说DDD(域驱动设计)更适合复杂域而不是简单域.
复杂域名的特征是什么?(请比"它有复杂的业务规则"更具体);
哪些是复杂域名的例子?
如何将域分类为复杂(即适用于DDD)?
我们有一个运行socket.io服务器的node.js脚本,其客户端使用来自RabbitMQ队列的消息.我们最近迁移到Amazon AWS,而RabbitMQ现在是两台机器(冗余实例)的集群.AMQP连接不时丢失(这是从具有冗余VM的高可用性环境到达的限制,我们必须应对它)并且如果尝试重新连接,则DNS选择要连接的实例(它是一个具有数据复制的集群,因此连接到哪个实例并不重要.
问题是从未进行重新连接的尝试; 一段时间后,当连接丢失时,amqp.node显然没有注意到连接已丢失.此外,消费者停止接收消息,而socket.io服务器只是停止接受新连接.
我们有一个55秒的心跳超时(不要与socket.io心跳超时混淆)设置在RabbitMQ URL并使用amqp.node的回调API检查"错误"和"关闭"事件,但它们显然从未发出.队列期望消耗的消息被激活.我们希望节点脚本检测丢失的连接并完成自身,因此环境将自动启动新进程并再次建立连接.
这是代码,也许我们在amqp.node回调API或其他方面做错了.
var express = require('express');
app = express();
var http = require('http');
var serverio = http.createServer(app);
var io = require('socket.io').listen(serverio, { log: false });
var socket;
var allcli = [];
var red, blue, green, magenta, reset;
red = '\033[31m';
blue = '\033[34m';
green = '\033[32m';
magenta = '\033[35m';
orange = '\033[43m';
reset = '\033[0m';
var queue = 'ha.atualizacao_mobile';
var urlRabbit = 'amqp://login:password@host?heartbeat=55' // Amazon
var amqp = require('amqplib/callback_api');
var debug = true;
console.log("Original Socket.IO …Run Code Online (Sandbox Code Playgroud) 首先,为长文本道歉,并在一个问题中提出这么多要点.我认为这样做是最好的,因为它们是相互关联的,也因为我认为任何有这种应用经验的人(Android套接字客户端与服务器保持持久连接以发送/接收消息)都能够回答所有或许多要点.基本上我正在询问有关一些设计决策的建议,我不确定"推荐的Android操作方式"是什么.
我正在尝试确定在Android中实现此类应用程序(套接字客户端)的最佳方法.它将使用诸如WebSocket,Socket.IO,TCP等的套接字通信技术来保持与远程服务器的持久连接以交换信息.我没有特别提到的案例,除了它可能不是聊天应用程序,因为它的优先技术是推送通知(GCM或类似的东西).我正在考虑一个应用程序,只要用户"登录"它就可以保持连接打开.
连接不应该与应用程序的活动相关联,即在用户离开应用程序之后仍然可以接收消息(最终创建通知).
我正在尝试回答的问题,以便定义这样的应用程序:
是否应将连接处理(连接/断开连接)和消息发送委托给单独的类(例如Singleton)?
选择广播将收到的消息传递给当前Activity似乎没问题; 有更合适的解决方案吗?Service即使应用程序架构相当简单,事件总线或绑定是否更可取?
考虑到连接必须在进程终止之间持续存在(因为系统通常会释放内存),最好的方法是将'connect'操作委托给一个Service带有重写startCommand()方法返回START_STICKY(这允许Service重新启动时尽快重启)系统的内存可用)?这是最合适的方法吗?我想是这样的,因为AlarmManager在这种情况下设置定期连接检查是不必要的,并且使用startForeground()不会阻止应用程序被杀死(它只是使得不太可能发生)并且还向用户显示不期望的通知应用程序是运行.
当我们就设计达成一致时,我认为需要添加唤醒锁,以防止设备在处理传入/传出数据时保持睡眠状态.我不知道如何将它们添加到最终设计中,我要求澄清.我想到了以下额外的考虑因素:
a)进入的数据预计会唤醒设备,但不能保证在它恢复睡眠之前完全处理;
b)设备在连接到服务器时处于睡眠状态(通过CONNECTIVITY_CHANGE广播发出信号)这一事实不应该阻止在应用程序中排队的多个外发消息被发送,但我不知道如何为此设计添加唤醒锁定以确保队列完全处理;
c)我的协议库可以准备与Android一起工作(即处理一个或多个非UI线程中的I/O),但可能无法保证其回调可以在非UI线程中运行(库可以将它们委托给UI线程).这可能会影响我通过代码处理唤醒锁的方式.
我是否需要保持一个主动运行的线程循环才能保持连接打开?我怎么能绕过那个?
对这些问题的任何反馈表示赞赏.