您 可以
在每次按键事件中使用当前输入的用户名查询服务器的用户数据库,以获取指定的输入组件(
EditText等),但这可能会占用大量网络资源,并且会产生大量线程来处理:
TextWatcher
在您的输入中添加一个,EditText
或在用户输入其名称的任何位置- 在该
onTextChanged
方法中,您将生成一个线程来联系数据库,并发送该CharSequence
值。服务器的响应将输出一些JSON,也许带有boolean属性,该属性说明用户名是否可用 - 用户点击“确定”,并希望自己注册自己的名字。由于他们的可用性可能已经发生了变化(例如,很多人一次注册全部),因此在他们实际获得此昵称之前,需要进行最终检查。
要么…
- 让用户输入所需的名称
- 让他们点击“保存”或“注册”
- 此时,请发送注册数据并将其保存在数据库中(如果名称可用)。否则,让用户知道不是,他们必须重试
要么…
当应用启动时(必须在选择名称之前),请与服务器的数据库联系,并向应用发送响应,其中包含已使用的名称列表。
这样,您可以轻松检查名称是否在电话上本地使用,而不用发送检查请求。
您仍然必须始终先检查昵称的可用性,然后再将其保存在服务器端
编辑:我已经实现了#2,这似乎是大多数应用程序为注册唯一名称所做的工作(我见过)
#1的问题-
用户输入1个字母(网络线程已启动)-用户输入另一个字母(另一个线程已启动)-用户输入了第3个字母(另一个线程)-线程2首先完成,名称有效,已通知用户-
线程1完成,名称无效,通知用户-线程3完成,名称无效,通知用户
线程2花费了4秒线程1花费了5秒线程3花费了5秒
假设用户不断输入25个字母,那么您必须跟踪很多术语,例如名称是否有效,是否以及哪些线程仍在运行等
对于这样一个简单的注册任务,这种方法似乎有点乏味,太麻烦了
#3的问题-需要向服务器发送1个额外的网络请求
我喜欢这种方法,因为您可以轻松快速地通知用户是否可以使用他们的姓名,而无需任何线程处理(取决于您的用户列表的大小),也不必担心检查需要多长时间
数字2很简单,容易,并且有机会只需要1个服务器请求



