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

各位大佬,我最近在做一个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个回答

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

qq_23931287
Newbieforme 回复z?????: 嗯,加油,祝你顺利,感谢采纳
2 年多之前 回复
qq_35528975
HanLin-Chong 厉害了,大佬,搞了这么久的问题居然是这么小的一个细节的问题,我百度了一下,新建一个looper就可以了:Looper.prepare(); Toast.makeText(Login.this,str,Toast.LENGTH_LONG).show(); Looper.loop();
2 年多之前 回复
qq_23931287
Newbieforme 删掉之后 你试试看
2 年多之前 回复

有报错信息吗?截图看下

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

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

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

这样就行了,

qq_34658785
卖太妃糖的古尔丹 因为它是在界面上显示的,说有界面上的显示,都必须在ui线程中进行
2 年多之前 回复
qq_34658785
卖太妃糖的古尔丹 当然MainActivity替换成你自己的Activity,这个ToastUtils.show是我自己写的一个工具类,你就用正常的Toast就行
2 年多之前 回复

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

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

Looper.prepare();
Toast.maketext(......).show();
Looper.loop();

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问