繁体   English   中英

从mysql检索数据时应用崩溃

[英]App crashing while retrieving data from mysql

嗨,大家好,我是android studio的新手,所以我仍然在学习。 但是今天我遇到了我无法解决的问题。 每次我在Asyntax中执行诸如"select * from databasename"类的sql查询并执行诸如while(rs.next)我的应用都会崩溃。 我确保我从数据库建立了连接。

ps。 我什至尝试使用strictmode在主目录中查询,但相同的结果不断崩溃

我已经尝试了所有在线教程,以至于我复制了每件事并下载了它们的源代码,但是最终得到了相同的结果。

这是我的MainActivity.java

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);
    }
}
}

这是我的xml文件,我认为这没有任何问题。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/txtView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="154dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="154dp"
    android:text="Hello World!"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/btnShow" />

<TextView
    android:id="@+id/txtView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="154dp"
    android:layout_marginTop="12dp"
    android:layout_marginEnd="154dp"
    android:text="Hello World!"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/txtView1" />

<Button
    android:id="@+id/btnShow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="148dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="148dp"
    android:text="@string/show"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout> 

这些是logcat即时通讯

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) 

堆栈跟踪中的消息已向您说明了此问题:

只有创建视图层次结构的原始线程才能触摸其视图

这告诉我您正在尝试从非UI线程操纵视图(例如,更新文本)。 铜杯:

textShow1.setText(msg);

解:

doInBackground之后, onPostExecute在UI线程上运行,因此移动textShow1.setText(msg); 在那里,使doInBackground返回msg而不是null

如果要在doInBackground内部执行UI doInBackground ,则可以使用runOnUiThread ,如下所示

@Override
protected String doInBackground(String... params) {

    runOnUiThread(new Runnable() {
        public void run() {

            //do your UI operations here
            textShow1.setText(msg);
         }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM