qq_35528975
HanLin-Chong
采纳率44.4%
2017-08-22 07:29

android直接连接mysql时,从返回的resultset取数据时出错

240
已采纳

各位大佬,我最近在做一个Android功能,遇到了一个麻烦.

我自己写了一个DBconnection类,让别的程序来调用此类以实现从远程服务器查询数据的功能,DBconnection这个类我已经在eclipse中成功的取出数据了,而且在Androidstudio中确定已经将mysql的驱动加入library了,数库库操作也是在子线程中进行的,然而按钮一点击这个app就闪退掉了,求大佬们帮忙看一下

以下是按钮点击查询

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new Thread(new Runnable() {

                    @Override

                    public void run() {
                        try {
                            String sql = "select*from ****";
                            DBconnection con = new DBconnection();
                            ResultSet rs=null;
                            String str="";
                            rs=con.doQuery(sql,"dbname");
                            while(rs.next()){
                                str+= rs.getString(1);
                            }
                            Toast.makeText(Login.this,str,Toast.LENGTH_LONG).show();//我的控制台不知道为什么用不了,所以只能用toast看了
                            con.close();
                        }catch(SQLException e){}

                    }
                }).start();

            }
        });

            }
        });

以下是我自己写的DBconnection类,这个类在eclipse中已经能成功的取数据了

 public class DBconnection {
    Connection conn=null;
    Statement pre=null;
    ResultSet rs=null;

    public Connection getConn(String dbname){
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(ClassNotFoundException e){}

        try {
            //----------------------------------get connection-------
            String uri = "jdbc:mysql://***.**.***.**:3306/" + dbname + "";
            String user = "*****";
            String pwd = "*******";
            conn = DriverManager.getConnection(uri, user, pwd);//get connection
        }catch(SQLException e1){}
        return conn;
    }

    public ResultSet doQuery(String sql,String dbname){
        try {
            pre=this.getConn(dbname).prepareStatement(sql);
            rs=pre.executeQuery(sql);
        } catch (SQLException e) {}
        return rs;
    }



    public void close(){
        try {
            if(rs!=null){
                rs.close();
                rs=null;
            }
            if(pre!=null){
                pre.close();
                pre=null;
            }
            if(conn!=null){
                conn.close();
                conn=null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答

  • qq_23931287 Newbieforme 4年前

    我好像知道了,线程里不可以操作界面,比如那个吐司 toast

    点赞 评论 复制链接分享
  • qq_35528975 HanLin-Chong 4年前

    感谢各位大佬,已经解决了,之前一直没注意是toast的问题,其实在子线程中不是不可以toast,用“Looper.prepare();”和“Loopper.loop();”把toast包住就行了:

    Looper.prepare();
    Toast.maketext(......).show();
    Looper.loop();
    
    
    点赞 评论 复制链接分享
  • zgy621101 紫风幻雪 4年前
    点赞 评论 复制链接分享
  • zgy621101 紫风幻雪 4年前

    吐司必须用在UI线程中也就是主线程,你可以在子线程请求成功之后,用handler向主线程专递一个信息,让主线程来弹出提示。

    点赞 评论 复制链接分享
  • qq_34658785 卖太妃糖的古尔丹 4年前

    大兄弟,Toast打印信息必须在UI线程里

                                        MainActivity.this.runOnUiThread(MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            ToastUtils.show(MainActivity.this, "网络请求错误");
                        }
                    });
    

    这样就行了,

    点赞 评论 复制链接分享
  • zy841958835 cloudyzhao 4年前

    既然DBconnection 这个类没有问题 肯定出在Toast.makeText(Login.this,str,Toast.LENGTH_LONG).show();这句
    可以看看这篇 解决了这个问题
    https://www.crifan.com/android_new_thread_toast_maketext_creash/
    谢谢

    点赞 评论 复制链接分享
  • qq_23931287 Newbieforme 4年前

    有报错信息吗?截图看下

    点赞 评论 复制链接分享