you could使用当前输入的用户名在指定输入组件的每个按键事件上查询服务器的用户数据库(EditText
等),但这可能是相当网络密集型的,并产生大量线程来处理:
- add a
TextWatcher
根据您的输入EditText
或用户输入他的名字的任何内容
- in the
onTextChanged
方法,您将生成一个线程来联系您的数据库发送CharSequence
价值。服务器的响应会输出一些 JSON,可能带有一个布尔属性,表示用户名是否可用
- 用户点击“确定”并希望他们的名字被自己注册。在他们真正获得这个昵称之前需要进行最后的检查,因为可用性可能已经改变(比如说很多人同时注册)
or...
- 让用户输入他们想要的名字
- 让他们点击“保存”或“注册”
- 此时,如果他们的名字可用,请发送注册数据并将其保存在数据库中。否则,让用户知道情况并非如此,他们必须重试
or...
当您的应用程序启动时(就在他们必须选择名称之前),请联系您的服务器的数据库并向应用程序发送包含已使用的名称列表的响应。
这样,您可以轻松检查该名称是否是在手机上本地获取的,而不是发送检查请求。
在将昵称保存到服务器端之前,您仍然必须始终检查昵称的可用性
编辑:
我已经实现了#2,这似乎是大多数应用程序注册唯一名称的方法(我见过)
问题#1
- 用户输入 1 个字母(网络线程启动)
- 用户输入另一个字母(另一个线程启动)
- 用户输入第三个字母(另一个线程)
- 线程 2 首先完成,名称有效,通知用户
- 线程 1 完成,名称无效,通知用户
- 线程 3 完成,名称无效,通知用户
线程 2 花了 4 秒
线程 1 花了 5 秒
线程 3 花了 5 秒
假设用户连续输入 25 个字母,那么您必须跟踪很多内容,例如名称是否有效、线程是否仍在运行以及哪些线程仍在运行等。
对于这么简单的注册任务来说,这种方法似乎有点太繁琐了,太麻烦了
#3 的问题
- 需要向服务器发出 1 个额外的网络请求
我喜欢这种方法,因为您可以轻松快速地通知用户他们的名字是否可用,而无需任何线程(取决于您的用户列表有多大)或担心检查需要多长时间
数字 2 简单、容易,并且有机会只需要 1 个服务器请求