Android实现登录注册功能

    • 一、项目简介
    • 二、Android实现登录注册功能
      • 1.数据库连接与断开类
      • 2.用户信息类
      • 3.用户数据操作类
      • 4.登录类
        • 4.1界面展示
        • 4.2功能描述
        • 4.3主要代码
      • 5.注册类
        • 5.1界面展示
        • 5.2功能描述
        • 5.3主要代码
      • 6.源码下载链接
    • 三、总结一下

一、项目简介

连接云数据库MySQL实现用户的登录注册功能。
布局方面:采取LinearLayout线性布局和RelativeLayout相对布局。
代码方面:
1.使用多线程:声明实现Runnable接口的类,重写run方法,实例化Runnable的实现类对象,传入某个线程的构造方法中,开启线程(.start())。
2.通过JDBC访问数据库:注册驱动,获取连接,获取语句执行对象,执行SQL语句,处理结果集,释放资源。

二、Android实现登录注册功能

1.数据库连接与断开类

MySQLConnection.java
1.注册驱动:JDBC规范定义驱动接口是java.sql.Driver,MySQL驱动包提供了实现类com.mysql.jdbc.Driver,开发时使用Class.forName()加载一个使用字符串描述的驱动类com.mysql.jdbc.Driver
加载驱动代码:Class.forName(“com.mysql.jdbc.Driver”).newInstance();
2.获取连接:Connection connection=DriverManager.getConnection(“jdbc:mysql://外网地址:端口/数据库名称”,“MySQL用户名”,“MySQL密码”);
关闭connection:connection.close();

public class MySQLConnection {//要连接MySQL数据库的URLURL_MySQL="jdbc:mysql://外网地址:端口/数据库名称"public static final String URL_MySQL="jdbc:mysql://外网地址:端口/数据库名称";//要连接MySQL数据库的用户名NAME_MySQL="MySQL用户名"public static final String NAME_MySQL="MySQL用户名";//要连接MySQL数据库的密码PASSWORD_MySQL="MySQL密码"public static final String PASSWORD_MySQL="MySQL密码";//使用PreparedStatement来执行SQL语句查询public static PreparedStatement preparedStatement;//使用Resultset接收JDBC查询语句返回的数据集对象public static ResultSet resultSet;//连接数据库public static Connection connection;public static void connect(){//开启连接数据库Log.d("注意","开启连接数据库中......");connection=null;try {//加载驱动Class.forName("com.mysql.jdbc.Driver").newInstance();//获取与数据库的连接connection= DriverManager.getConnection(URL_MySQL,NAME_MySQL,PASSWORD_MySQL);}catch (Exception e){//对异常情况进行处理e.printStackTrace();}}public static void close(){Log.d("注意","正在关闭数据库连接......");try{if(resultSet!=null){resultSet.close();//关闭接收resultSet=null;}if(preparedStatement!=null){preparedStatement.close();//关闭sql语句查询preparedStatement=null;}if(connection!=null){connection.close();//关闭数据库连接connection=null;}}catch (Exception e){//对异常情况进行处理e.printStackTrace();}}}

2.用户信息类

User.java

public class User {private String username;private String userpassword;public User(){}public User(String username,String userpassword){this.username=username;this.userpassword=userpassword;}public String getUsername(){return username;}public void setUsername(String username) {this.username = username;}public String getUserpassword() {return userpassword;}public void setUserpassword(String userpassword) {this.userpassword = userpassword;}}

3.用户数据操作类

UserDao.java
这里实现查找用户名操作,查找用户名和密码操作
注册功能:实现向数据库中添加用户数据信息操作
String sql=“sql语句”;
PreparedStatement preparedStatement=connection.prepareStatement(sql);
这里connection是数据库连接对象,通过connection连接对象调用prepareStatement()方法就可以获得sql语句的执行对象preparedStatement,然后通过PreparedStatement对象就可以调用方法执行sql语句。
这里主要用到两种方法

方法执行结果
preparedStatement.executeQuery()执行select语句,返回查询结果
preparedStatement.executeUpdate()执行insert、updata和delete语句,返回值类型为整型,表示受影响行数

while (resultSet.next())
{
user=new User();
user.setUsername(resultSet.getString(“username”));
user.setUserpassword(resultSet.getString(“userpassword”));
}
这里使用结果集ResultSet,调用next()方法指向结果集,若结果集不为空,则返回true。resultSet.next()指向某一行记录

public class UserDao extends MySQLConnection{public User findUserName(String username){connect();User user=null;try {//sql语句。我这里是根据我自己的users表的username字段来查询记录String sql="select * from users where username=?";//获取用于向数据库发送sql语句的preparedStatementpreparedStatement=connection.prepareStatement(sql);//根据账号进行查询preparedStatement.setString(1,username);//执行sql查询语句并返回结果集resultSet=preparedStatement.executeQuery();while (resultSet.next()){//.next()表示指针先下一行,若有数据则返回trueuser=new User();user.setUsername(resultSet.getString("username"));}}catch (Exception e){e.printStackTrace();}finally {close();}return user;//若传入成功返回账号,失败则为null}public User findUser(String username,String userpassword){connect();User user=null;try {//sql语句。我这里是根据我自己的users表的username和password字段来查询记录String sql="select * from users where username=? and password=?";//获取用于向数据库发送sql语句的preparedStatementpreparedStatement=connection.prepareStatement(sql);//根据账号和密码进行查询preparedStatement.setString(1,username);preparedStatement.setString(2,userpassword);resultSet=preparedStatement.executeQuery();while (resultSet.next()){user=new User();user.setUsername(resultSet.getString("username"));user.setUserpassword(resultSet.getString("userpassword"));}}catch (Exception e){e.printStackTrace();}finally {close();}return user;//若传入成功返回账号和密码,失败则为null}public int registerUser(User user){int value=0;connect();try{String sql="insert into users(username,password) values(?,?)";preparedStatement=connection.prepareStatement(sql);//将数据插入数据库中preparedStatement.setString(1,user.getUsername());preparedStatement.setString(2,user.getUserpassword());value=preparedStatement.executeUpdate();}catch (Exception e){e.printStackTrace();}finally {close();}return value;}}

4.登录类

4.1界面展示

4.2功能描述

当输入用户名和密码后,若存在,则点击登录按钮登录成功后回到主界面,若不存在,则会弹出提醒对话框并清空输入框;
当输入用户名、密码、用户名和密码为空时,分别弹出提醒对话框;
当点击了记住账号、记住密码后,重新进入登录界面,用户名和密码依旧存在,但若输入的用户名和密码错误,则会取消记住功能,并清空输入框。

4.3主要代码

activity_login.xml

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#66BB"tools:context=".LoginActivity"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/login_background"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:orientation="vertical"android:gravity="bottom"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><TextViewandroid:id="@+id/textview_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录"android:textSize="25sp"android:textStyle="bold"android:background="@drawable/shape_rectangle_textview"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/></LinearLayout></LinearLayout><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"></TextView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="15dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:text="账号:"android:textColor="#000000"android:textStyle="bold"android:textSize="15sp"android:gravity="center"android:background="@drawable/shape_oval_textview"/><EditTextandroid:id="@+id/editText_username"android:layout_width="match_parent"android:layout_height="match_parent"android:inputType="textPassword"android:maxLength="9"android:hint="请输入用户名"android:textColorHint="#999999"android:background="@drawable/shape_round_rectangle"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="15dp"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:text="密码:"android:textColor="#000000"android:textStyle="bold"android:textSize="15sp"android:gravity="center"android:background="@drawable/shape_oval_textview"/><EditTextandroid:id="@+id/editText_userpassword"android:layout_width="match_parent"android:layout_height="match_parent"android:inputType="numberPassword"android:maxLength="9"android:hint="请输入密码"android:textColorHint="#999999"android:background="@drawable/shape_round_rectangle"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><CheckBoxandroid:id="@+id/checkbox_remember_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:text="记住账号"android:textColor="#FFC0CB"android:textStyle="bold"android:background="@drawable/shape_rectangle_textview"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><CheckBoxandroid:id="@+id/checkbox_remember_password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:text="记住密码"android:textColor="#FFC0CB"android:textStyle="bold"android:background="@drawable/shape_rectangle_textview"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/button_register_no"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><Buttonandroid:id="@+id/button_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录" /></LinearLayout></LinearLayout></LinearLayout></RelativeLayout>

LoginActivity.java

public void login(){EditText editText_username=findViewById(R.id.editText_username);//获取EditText实例EditText editText_userpassword=findViewById(R.id.editText_userpassword);//获取EditText实例final String username=editText_username.getText().toString().trim();//获取用户输入的用户名final String userpassword=editText_userpassword.getText().toString().trim();//获取用户输入的密码if(TextUtils.isEmpty(username)&&!TextUtils.isEmpty(userpassword)){//弹出提醒对话框,提醒用户用户名不能为空AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);builder.setIcon(R.mipmap.ic_launcher);builder.setTitle("尊敬的用户");builder.setMessage("用户名不能为空,请输入!");builder.setPositiveButton("好的",null);AlertDialog alertDialog=builder.create();alertDialog.show();//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高editText_username.requestFocus();}else if (TextUtils.isEmpty(userpassword)&&!TextUtils.isEmpty(username)){//弹出提醒对话框,提醒用户密码不能为空AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);builder.setIcon(R.mipmap.ic_launcher);builder.setTitle("尊敬的用户");builder.setMessage("密码不能为空,请输入!");builder.setPositiveButton("好的",null);AlertDialog alertDialog=builder.create();alertDialog.show();//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高editText_userpassword.requestFocus();}else if(TextUtils.isEmpty(username)&&TextUtils.isEmpty(userpassword)){AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);builder.setIcon(R.mipmap.ic_launcher);builder.setTitle("尊敬的用户");builder.setMessage("请输入用户名和密码!");builder.setPositiveButton("好的",null);AlertDialog alertDialog=builder.create();alertDialog.show();//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高editText_username.requestFocus();editText_userpassword.requestFocus();}else{//这里要以线程访问,否则会报错new Thread(new Runnable() {@Overridepublic void run() {final User user_name=userDao.findUserName(username);final User user=userDao.findUser(username,userpassword);//这里使用Handler类中常用的一个方法,post(Runnable r),立即发送Runnable对象。这里使用已经创建的android.os.Handler对象handler.post(new Runnable() {@Overridepublic void run() {if(user_name==null){//创建提醒对话框的建造器AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);//设计对话框标题图标builder.setIcon(R.mipmap.ic_launcher);//设置对话框标题文本builder.setTitle("尊敬的用户");//设置对话框内容文本builder.setMessage("您所输入的账号不存在,请重新输入!");//设置对话框的肯定按钮文本及其点击监听器builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {editText_username.setText("");//清空editText_username内容editText_userpassword.setText("");//清空editText_userpassword内容SharedPreferences.Editor editor=sharedPreferences.edit();editor.putBoolean("ischeckName",false);editor.putString("username","");editor.putBoolean("ischeckPassword",false);editor.putString("userpassword","");editor.commit();CheckBox checkbox_remember_id=findViewById(R.id.checkbox_remember_id);//获取CheckBox实例CheckBox checkbox_remember_password=findViewById(R.id.checkbox_remember_password);//获取CheckBox实例checkbox_remember_id.setChecked(false);checkbox_remember_password.setChecked(false);}});AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象alertDialog.show();//显示提醒对话框//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高return;}if(user==null){//创建提醒对话框的建造器AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);//设计对话框标题图标builder.setIcon(R.mipmap.ic_launcher);//设置对话框标题文本builder.setTitle("尊敬的用户");//设置对话框内容文本builder.setMessage("您所输入的密码错误,请重新输入!");//设置对话框的肯定按钮文本及其点击监听器builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {editText_userpassword.setText("");//清空editText_userpassword内容SharedPreferences.Editor editor=sharedPreferences.edit();editor.putBoolean("ischeckName",false);editor.putString("username","");editor.putBoolean("ischeckPassword",false);editor.putString("userpassword","");editor.commit();CheckBox checkbox_remember_id=findViewById(R.id.checkbox_remember_id);//获取CheckBox实例CheckBox checkbox_remember_password=findViewById(R.id.checkbox_remember_password);//获取CheckBox实例checkbox_remember_id.setChecked(false);checkbox_remember_password.setChecked(false);}});AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象alertDialog.show();//显示提醒对话框//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高return;}else{//如果勾选了"记住账号"复选框,就把账号保存到共享参数里if(isRememberUserName){SharedPreferences.Editor editor=sharedPreferences.edit();//获取编辑器对象editor.putBoolean("ischeckName",true);editor.putString("username",editText_username.getText().toString());//添加名为username的账号editor.commit();//提交编辑器修改}//如果勾选了“记住密码"复选框,就把密码保存到共享参数里if(isRememberUserPassword){SharedPreferences.Editor editor=sharedPreferences.edit();editor.putBoolean("ischeckPassword",true);editor.putString("userpassword",editText_userpassword.getText().toString());//添加名为userpassword的密码editor.commit();}//创建一个意图对象,准备跳转到指定的活动页面Intent intent=new Intent(LoginActivity.this,MainActivity.class);//跳转到意图对象指定的活动页面startActivity(intent);}}});}}).start();}}//设计读取button按钮点击的功能函数onClick()@RequiresApi(api = Build.VERSION_CODES.N)@Overridepublic void onClick(View v) {if(v.getId()==R.id.button_register_no){//创建一个意图对象,准备跳转到指定的活动页面Intent intent=new Intent(this,RegisterActivity.class);//跳转到意图对象指定的活动页面startActivity(intent);}if(v.getId()==R.id.button_login){login();}}

5.注册类

5.1界面展示

5.2功能描述

当输入的账号已在数据库中存在时,则会弹出提醒对话框,并清空所有输入框,若不存在,且之后操作无误,则点击注册按钮注册成功返回登录界面;
当输入的密码与确认密码不同时,则弹出提醒对话框,并清空输入框;
当输入框为空,则会弹出提醒对话框;
当点击显示密码、显示确认时,会显示隐藏的内容。

5.3主要代码

activity_register.xml

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#66BB"tools:context=".RegisterActivity"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/register_background"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:gravity="bottom"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><TextViewandroid:id="@+id/textview_register"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册"android:textSize="25sp"android:textStyle="bold"android:background="@drawable/shape_rectangle_textview"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/></LinearLayout></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></TextView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:layout_marginBottom="7dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:text="账号:"android:textColor="#000000"android:textStyle="bold"android:textSize="15sp"android:gravity="center"android:background="@drawable/shape_oval_textview"/><EditTextandroid:id="@+id/editText_username"android:layout_width="match_parent"android:layout_height="match_parent"android:maxLength="9"android:hint="请输入用户名"android:textColorHint="#999999"android:background="@drawable/shape_round_rectangle"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:layout_marginBottom="7dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:text="密码:"android:textColor="#000000"android:textStyle="bold"android:textSize="15sp"android:gravity="center"android:background="@drawable/shape_oval_textview"/><EditTextandroid:id="@+id/editText_userpassword"android:layout_width="match_parent"android:layout_height="match_parent"android:maxLength="9"android:inputType="numberPassword"android:hint="请输入密码"android:textColorHint="#999999"android:background="@drawable/shape_round_rectangle"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"android:layout_marginBottom="7dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:text="确认:"android:textColor="#000000"android:textStyle="bold"android:textSize="15sp"android:gravity="center"android:background="@drawable/shape_oval_textview"/><EditTextandroid:id="@+id/editText_userpassword_define"android:layout_width="match_parent"android:layout_height="match_parent"android:maxLength="9"android:inputType="numberPassword"android:hint="请输入确认密码"android:textColorHint="#999999"android:background="@drawable/shape_round_rectangle"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><CheckBoxandroid:id="@+id/checkbox_show_password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:text="显示密码"android:textColor="#FFC0CB"android:textStyle="bold"android:background="@drawable/shape_rectangle_textview"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><CheckBoxandroid:id="@+id/checkbox_show_password_affirm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:text="显示确认"android:textColor="#FFC0CB"android:textStyle="bold"android:background="@drawable/shape_rectangle_textview"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/></LinearLayout></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/button_return_login"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="返回" /><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><Buttonandroid:id="@+id/button_register_yes"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确定注册"/></LinearLayout></LinearLayout></RelativeLayout>

RegisterActivity.java

public void register(){EditText editText_username=findViewById(R.id.editText_username);//获取EditText实例EditText editText_userpassword=findViewById(R.id.editText_userpassword);//获取EditText实例EditText editText_userpassword_define=findViewById(R.id.editText_userpassword_define);//获取EditText实例final String username=editText_username.getText().toString().trim();//获取用户输入的用户名final String userpassword=editText_userpassword.getText().toString().trim();//获取用户输入的密码if(TextUtils.isEmpty(username)&&!TextUtils.isEmpty(userpassword)){//弹出提醒对话框,提醒用户用户名不能为空AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);builder.setIcon(R.mipmap.ic_launcher);builder.setTitle("尊敬的用户");builder.setMessage("用户名不能为空,请输入!");builder.setPositiveButton("好的",null);AlertDialog alertDialog=builder.create();alertDialog.show();//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高editText_username.requestFocus();}else if (TextUtils.isEmpty(userpassword)&&!TextUtils.isEmpty(username)){//弹出提醒对话框,提醒用户密码不能为空AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);builder.setIcon(R.mipmap.ic_launcher);builder.setTitle("尊敬的用户");builder.setMessage("密码不能为空,请输入!");builder.setPositiveButton("好的",null);AlertDialog alertDialog=builder.create();alertDialog.show();//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高editText_userpassword.requestFocus();}else if(TextUtils.isEmpty(username)&&TextUtils.isEmpty(userpassword)){AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);builder.setIcon(R.mipmap.ic_launcher);builder.setTitle("尊敬的用户");builder.setMessage("请输入用户名和密码!");builder.setPositiveButton("好的",null);AlertDialog alertDialog=builder.create();alertDialog.show();//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高editText_username.requestFocus();editText_userpassword.requestFocus();}else{final User user=new User();user.setUsername(username);user.setUserpassword(userpassword);new Thread(new Runnable() {@Overridepublic void run() {final int value=userDao.registerUser(user);//这里使用Handler类中常用的一个方法,post(Runnable r),立即发送Runnable对象。这里使用已经创建的android.os.Handler对象handler.post(new Runnable() {@Overridepublic void run() {//创建一个意图对象,准备跳转到指定的活动页面Intent intent=new Intent(RegisterActivity.this,LoginActivity.class);//跳转到意图对象指定的活动页面startActivity(intent);}});}}).start();}}//设计读取button按钮点击的功能函数onClick()@RequiresApi(api = Build.VERSION_CODES.N)@Overridepublic void onClick(View v) {if(v.getId()==R.id.button_return_login){//创建一个意图对象,准备跳转到指定的活动页面Intent intent=new Intent(this,LoginActivity.class);//跳转到意图对象指定的活动页面startActivity(intent);}if(v.getId()==R.id.button_register_yes){EditText editText_username=findViewById(R.id.editText_username);//获取EditText实例EditText editText_userpassword=findViewById(R.id.editText_userpassword);//获取EditText实例EditText editText_userpassword_define=findViewById(R.id.editText_userpassword_define);//获取EditText实例final String username=editText_username.getText().toString().trim();//获取用户输入的用户名String password1=editText_userpassword.getText().toString();String password2=editText_userpassword_define.getText().toString();if(password1.equals(password2)){//密码和确认密码相同//这里要以线程访问,否则会报错new Thread(new Runnable() {@Overridepublic void run() {final User user_name=userDao.findUserName(username);//这里使用Handler类中常用的一个方法,post(Runnable r),立即发送Runnable对象。这里使用已经创建的android.os.Handler对象handler.post(new Runnable() {@Overridepublic void run() {if(user_name!=null){//创建提醒对话框的建造器AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);//设计对话框标题图标builder.setIcon(R.mipmap.ic_launcher);//设置对话框标题文本builder.setTitle("尊敬的用户");//设置对话框内容文本builder.setMessage("您所输入的账号已存在,请重新输入!");//设置对话框的肯定按钮文本及其点击监听器builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {editText_username.setText("");//清空editText_username内容editText_userpassword.setText("");//清空editText_userpassword内容editText_userpassword_define.setText("");//清空editText_userpassword_define内容}});AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象alertDialog.show();//显示提醒对话框//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高return;}else{register();}}});}}).start();}else{//不同//创建提醒对话框的建造器AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);//设计对话框标题图标builder.setIcon(R.mipmap.ic_launcher);//设置对话框标题文本builder.setTitle("尊敬的用户");//设置对话框内容文本builder.setMessage("密码和确认密码不同,请重新输入!");//设置对话框的肯定按钮文本及其点击监听器builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {editText_userpassword.setText("");//清空editText_userpassword内容editText_userpassword_define.setText("");//清空editText_userpassword_define内容}});AlertDialog alertDialog=builder.create();//根据建造器构建提醒对话框对象alertDialog.show();//显示提醒对话框//设计AlertDialog提醒对话框大小WindowManager.LayoutParams layoutParams=alertDialog.getWindow().getAttributes();layoutParams.width=700;layoutParams.height=565;alertDialog.getWindow().setAttributes(layoutParams);//设置AlertDialog的宽高return;}}}

6.源码下载链接

GitHub链接: Android登录注册功能(连接云数据库MySQL)

三、总结一下

当某个程序第一次启动的时候,Android会启动一条主线程负责接收用户的输入以及操作结果的反馈,也称UI线程,创建子线程是为了执行一些可能产生阻塞操作而新启动的线程。
这里使用Handler类中的一个常用方法post(Runnable r),立即发送Runnable对象,可以方便地使用Handler来进行消息传递。