我自己写了一个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();
}
}
}
我好像知道了,线程里不可以操作界面,比如那个吐司 toast
有报错信息吗?截图看下
既然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, "网络请求错误");
}
});
这样就行了,
吐司必须用在UI线程中也就是主线程,你可以在子线程请求成功之后,用handler向主线程专递一个信息,让主线程来弹出提示。
感谢各位大佬,已经解决了,之前一直没注意是toast的问题,其实在子线程中不是不可以toast,用“Looper.prepare();”和“Loopper.loop();”把toast包住就行了:
Looper.prepare();
Toast.maketext(......).show();
Looper.loop();