小编Pio*_*zan的帖子

片段的onDestroyView被调用,但视图没有被销毁

Android片段生命周期显示,当片段被添加到backstack然后被删除/替换时,将onDestroyView()被调用,稍后,当片段从backstack返回到布局时,将onCreateView()被调用.

根据我的理解,这意味着片段的视图正在被破坏和重新创建.如果用户EditText在片段A中输入文本并转到片段B然后再返回到A,则当片段返回时,其EditText内容将被删除.

但是,以下代码中没有发生这种情况; 谁能解释为什么?我已经验证了FragmentAonDestroyView()被调用.

在此输入图像描述

MainActivity.java

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)

android android-fragments

15
推荐指数
1
解决办法
2万
查看次数

DDD - 什么是复杂域名?

人们常说DDD(域驱动设计)更适合复杂域而不是简单域.

复杂域名的特征是什么?(请比"它有复杂的业务规则"更具体);

哪些是复杂域名的例子?

如何将域分类为复杂(即适用于DDD)?

domain-driven-design

8
推荐指数
1
解决办法
806
查看次数

amqp.node不会检测到连接丢弃

我们有一个运行socket.io服务器的nod​​e.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)

rabbitmq amazon-web-services node.js socket.io node-amqp

7
推荐指数
1
解决办法
4148
查看次数

简单套接字客户端应用程序的模式或最佳实践

(葡萄牙语也提出这个问题.)

首先,为长文本道歉,并在一个问题中提出这么多要点.我认为这样做是最好的,因为它们是相互关联的,也因为我认为任何有这种应用经验的人(Android套接字客户端与服务器保持持久连接以发送/接收消息)都能够回答所有或许多要点.基本上我正在询问有关一些设计决策的建议,我不确定"推荐的Android操作方式"是什么.

我正在尝试确定在Android中实现此类应用程序(套接字客户端)的最佳方法.它将使用诸如WebSocket,Socket.IO,TCP等的套接字通信技术来保持与远程服务器的持久连接以交换信息.我没有特别提到的案例,除了它可能不是聊天应用程序,因为它的优先技术是推送通知(GCM或类似的东西).我正在考虑一个应用程序,只要用户"登录"它就可以保持连接打开.

连接不应该与应用程序的活动相关联,即在用户离开应用程序之后仍然可以接收消息(最终创建通知).

我正在尝试回答的问题,以便定义这样的应用程序:

  1. 是否应将连接处理(连接/断开连接)和消息发送委托给单独的类(例如Singleton)?

  2. 选择广播将收到的消息传递给当前Activity似乎没问题; 有更合适的解决方案吗?Service即使应用程序架构相当简单,事件总线或绑定是否更可取?

  3. 考虑到连接必须在进程终止之间持续存在(因为系统通常会释放内存),最好的方法是将'connect'操作委托给一个Service带有重写startCommand()方法返回START_STICKY(这允许Service重新启动时尽快重启)系统的内存可用)?这是最合适的方法吗?我想是这样的,因为AlarmManager在这种情况下设置定期连接检查是不必要的,并且使用startForeground()不会阻止应用程序被杀死(它只是使得不太可能发生)并且还向用户显示不期望的通知应用程序是运行.

  4. 当我们就设计达成一致时,我认为需要添加唤醒锁,以防止设备在处理传入/传出数据时保持睡眠状态.我不知道如何将它们添加到最终设计中,我要求澄清.我想到了以下额外的考虑因素:

    a)进入的数据预计会唤醒设备,但不能保证在它恢复睡眠之前完全处理;

    b)设备在连接到服务器时处于睡眠状态(通过CONNECTIVITY_CHANGE广播发出信号)这一事实不应该阻止在应用程序中排队的多个外发消息被发送,但我不知道如何为此设计添加唤醒锁定以确保队列完全处理;

    c)我的协议库可以准备与Android一起工作(即处理一个或多个非UI线程中的I/O),但可能无法保证其回调可以在非UI线程中运行(库可以将它们委托给UI线程).这可能会影响我通过代码处理唤醒锁的方式.

  5. 我是否需要保持一个主动运行的线程循环才能保持连接打开?我怎么能绕过那个?

对这些问题的任何反馈表示赞赏.

sockets client android chat

6
推荐指数
0
解决办法
910
查看次数