青楓。 2020-03-15 14:15 采纳率: 0%
浏览 406

Android studio访问mysql闪退,本地测试可以

使用为mysql-connector-java-8.0.16.jar以及mysql8.0.19
在本地测试通过
public class DBUtils {
private static String driver = "com.mysql.cj.jdbc.Driver";//MySQL 驱动
private static String url = "jdbc:mysql://192.168.2.146:3306/helper?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";//MYSQL数据库连接Url
private static String user = "wang";//用户名
private static String password = "Imissyou**";//密码

private static Connection getConnection() {
    Connection conn = null;
    try {
        Class.forName(driver); //
        conn = DriverManager.getConnection(url,user,password);
    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
    return conn;
}
public static Map<String, String> login(User user) {
    HashMap<String, String> map = new HashMap<>();
    Connection conn = getConnection();
    try {
        Statement st = conn.createStatement();
        String sql= "select * from user where username ='" + user.getUsername()
                + "' and password ='" + user.getPassword() + "'";
        ResultSet res = st.executeQuery(sql);
        if (res == null) {
            return null;
        } else {
            int cnt = res.getMetaData().getColumnCount();
            res.next();
            for (int i = 1; i <= cnt; ++i) {
                String field = res.getMetaData().getColumnName(i);
                map.put(field, res.getString(field));
            }
            conn.close();
            st.close();
            res.close();
            return map;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public static void main(String []args){
    User user = new User("aaa","123456");
    Map<String,String> result= DBUtils.login(user);
    System.out.println(result);
}

}

但是在主界面绑定事件,访问数据库时直接闪退并报错
图片说明

主界面代码如下:
package com.example.helper;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Map;

public class MainActivity extends AppCompatActivity {

private Button register;
private Button login_user;
private TextView forget_password;
private TextView login_visitor;
private EditText et_username;
private EditText et_password;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //初始化控件
    init();

     //注册界面跳转
    register.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
            startActivity(intent);
        }
    });
     //登录功能未加载,等待后台数据库完善
    login_user.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String username = et_username.getText().toString(); //获取用户名
            String password = et_password.getText().toString(); //获取密码

            if(TextUtils.isEmpty(username)){
                Toast.makeText(MainActivity.this,"请输入用户名",Toast.LENGTH_SHORT).show();
            }
            else if(TextUtils.isEmpty(password)){
                Toast.makeText(MainActivity.this,"请输入密码",Toast.LENGTH_SHORT).show();
            }
            //本地管理员帐号
            else if(username.equals("admin")&&password.equals("admin")){
                Intent intent = new Intent(MainActivity.this,HomePageActivity.class);
                startActivity(intent);
            }
            //else Toast.makeText(MainActivity.this,"未连接后台数据库",Toast.LENGTH_SHORT).show();

            else{
                User user = new User(username,password);
                checkLogin(user);

                //Toast.makeText(MainActivity.this,"已获取"+username+" "+password,Toast.LENGTH_SHORT).show();

            }
        }
    });

     //首页跳转
    login_visitor.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(MainActivity.this, HomePageActivity.class);
            startActivity(intent);
        }
    });

    //找回密码界面跳转
    forget_password.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this,ForgetPasswordActivity.class);
            startActivity(intent);
        }
    });

}

private void init() {
    et_username = findViewById(R.id.et_username);
    et_password = findViewById(R.id.et_password);
    register = findViewById(R.id.btn_2);
    login_user = findViewById(R.id.btn_1);
    login_visitor = findViewById(R.id.login_visitor);
    forget_password = findViewById(R.id.forget_password);
}

class DBThread implements Runnable {
    private User user;
    private Context context;

    public void setUser(User user) {
        this.user = user;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    @Override
    public void run() {
        Map<String,String> result= DBUtils.login(user);
        /*
        if (result != null && result.size() > 0) {
            Intent intent = new Intent(MainActivity.this,HomePageActivity.class);
            Toast.makeText(MainActivity.this,"有此帐号",Toast.LENGTH_SHORT).show();
            startActivity(intent);
        }

         */
    }
}
private void checkLogin(User u) {
    DBThread dt = new DBThread();
    dt.setUser(u);
    dt.setContext(MainActivity.this);
    Thread thread = new Thread(dt);
    thread.start();

}

}

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 02:48
    关注

    根据你提供的信息,可能出现闪退的原因有以下几种可能:

    1.网络连接异常。检查连接数据库的IP地址是否正确,端口号是否被占用,以及网络连通性是否正常。

    2.代码逻辑错误。检查代码逻辑是否有问题,例如使用了空指针、类型转换异常等错误。

    3.使用了过期的或不兼容的库文件。检查使用的库文件是否与所使用的Android Studio版本相兼容,是否支持所使用的MySQL版本。

    你可以添加日志来调试代码并获取更详细的错误信息,例如在代码中使用 Log.e("tag", "message", exception) 输出错误信息。

    另外,可能的一个解决方案是在 AndroidManifest.xml 文件的 application 节点中添加以下代码:

    <application
        ...
        android:usesCleartextTraffic="true"   // 允许明文的网络请求,例如 HTTP
        ...>
        ...
    </application>
    

    这是因为 Android 9 引入了网络安全性限制,不允许明文的网络请求。所以,如果你的服务器使用的是 HTTP 协议,你需要添加上面的代码来解决这个问题。

    希望这些信息可以帮助你解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题