Android 从mysql检索数据时应用程序崩溃
大家好,我是安卓工作室的新手,所以我还在学习。但是今天我遇到了一些我无法解决的问题。每次我在Asyntax中执行一个sql查询,比如从databasename中选择*,然后执行whilers.next之类的操作,我的应用程序就会不断崩溃。我确保我从数据库建立了连接 另外,我甚至尝试了strictmode在main中进行查询,但相同的结果不断崩溃 我在网上尝试了每一个教程,我复制了每一个东西并下载了它们的源代码,但最终得到了相同的结果 这是我的MainActivity.javaAndroid 从mysql检索数据时应用程序崩溃,android,mysql,crash,Android,Mysql,Crash,大家好,我是安卓工作室的新手,所以我还在学习。但是今天我遇到了一些我无法解决的问题。每次我在Asyntax中执行一个sql查询,比如从databasename中选择*,然后执行whilers.next之类的操作,我的应用程序就会不断崩溃。我确保我从数据库建立了连接 另外,我甚至尝试了strictmode在main中进行查询,但相同的结果不断崩溃 我在网上尝试了每一个教程,我复制了每一个东西并下载了它们的源代码,但最终得到了相同的结果 这是我的MainActivity.java public cl
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnShow = findViewById(R.id.btnShow);
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
GetData retrieveData = new GetData();
retrieveData.execute();
}
});
}
private class GetData extends AsyncTask<String,String,String>{
String msg="";
final TextView textShow = findViewById(R.id.txtView1);
final TextView textShow1 = findViewById(R.id.txtView);
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://" + ConnectURL.DATABASE_URL + "/" + ConnectURL.DATABASE_NAME;
@Override
protected void onPreExecute(){
String Xmsg="Connecting to database...";
textShow.setText(Xmsg);
}
@Override
protected String doInBackground(String... params) {
Connection conn=null;
Statement stmt=null;
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, ConnectURL.USERNAME, ConnectURL.PASSWORD);
stmt = conn.createStatement();
String sql = "Select * from poultryinfo";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData rmrs = rs.getMetaData();
msg="Connection completed";
while(rs.next()) {
msg += rmrs.getColumnName(2) + ":" + rs.getString("valName") + "\n";
}
textShow1.setText(msg);
rs.close();
stmt.close();
conn.close();
} catch (SQLException connError){
msg="An exception was thrown JDBC"+ connError.toString();
connError.printStackTrace();
} catch (ClassNotFoundException e) {
msg = "A class not found exception" + e.toString();
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
msg = e.toString();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
msg = e.toString();
}
}
return null;
}
@Override
protected void onPostExecute(String msg){
textShow.setText(this.msg);
}
}
}
堆栈跟踪中的消息已向您解释了该问题: 只有创建视图层次结构的原始线程才能接触其视图 这说明您正在尝试操作视图,例如从非UI线程更新文本。丘比特:
textShow1.setText(msg);
解决方案:
doInBackground之后,onPostExecute在UI线程上运行,因此移动textShow1.setTextmsg;如果您想在doInBackground中执行UI操作,可以使用RunUnuithRead,如下所示
欢迎!看来我得学读书了!对不起,伙计,我只是没有在日志上看到,也不知道这是什么意思xD!谢谢你,成功了@JBie没问题,请始终查看堆栈跟踪以查找由。另外,由于您是新来的,请不要忘记,您可以单击答案左侧的勾号和箭头,将您的问题标记为已解决/感谢回答者对不起,但是从异步任务中执行此操作将是一个完全的黑客行为,违背了异步任务的目的
10-08 18:33:58.620 25502-25502/? E/Zygote: v2
10-08 18:33:58.620 25502-25502/? E/Zygote: accessInfo : 0
10-08 18:34:00.250 25502-25502/com.example.jade.connectionpractice E/Qmage:
isQIO : stream is not a QIO file
10-08 18:34:02.830 25502-25813/com.example.jade.connectionpractice
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.jade.connectionpractice, PID: 25502
java.lang.RuntimeException: An error occurred while executing
doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8355)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1327)
at android.view.View.requestLayout(View.java:20170)
at android.view.View.requestLayout(View.java:20170)
at android.view.View.requestLayout(View.java:20170)
at android.view.View.requestLayout(View.java:20170)
at android.view.View.requestLayout(View.java:20170)
at android.view.View.requestLayout(View.java:20170)
at android.support.constraint.ConstraintLayout.requestLayout(ConstraintLayout.java:3172)
at android.view.View.requestLayout(View.java:20170)
at android.widget.TextView.checkForRelayout(TextView.java:8425)
at android.widget.TextView.setText(TextView.java:5011)
at android.widget.TextView.setText(TextView.java:4836)
at android.widget.TextView.setText(TextView.java:4811)
at com.example.jade.connectionpractice.MainActivity$GetData.doInBackground(MainActivity.java:65)
at com.example.jade.connectionpractice.MainActivity$GetData.doInBackground(MainActivity.java:33)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
textShow1.setText(msg);
@Override
protected String doInBackground(String... params) {
runOnUiThread(new Runnable() {
public void run() {
//do your UI operations here
textShow1.setText(msg);
}
});
}