Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从mysql检索数据时应用程序崩溃_Android_Mysql_Crash - Fatal编程技术网

Android 从mysql检索数据时应用程序崩溃

Android 从mysql检索数据时应用程序崩溃,android,mysql,crash,Android,Mysql,Crash,大家好,我是安卓工作室的新手,所以我还在学习。但是今天我遇到了一些我无法解决的问题。每次我在Asyntax中执行一个sql查询,比如从databasename中选择*,然后执行whilers.next之类的操作,我的应用程序就会不断崩溃。我确保我从数据库建立了连接 另外,我甚至尝试了strictmode在main中进行查询,但相同的结果不断崩溃 我在网上尝试了每一个教程,我复制了每一个东西并下载了它们的源代码,但最终得到了相同的结果 这是我的MainActivity.java public cl

大家好,我是安卓工作室的新手,所以我还在学习。但是今天我遇到了一些我无法解决的问题。每次我在Asyntax中执行一个sql查询,比如从databasename中选择*,然后执行whilers.next之类的操作,我的应用程序就会不断崩溃。我确保我从数据库建立了连接

另外,我甚至尝试了strictmode在main中进行查询,但相同的结果不断崩溃

我在网上尝试了每一个教程,我复制了每一个东西并下载了它们的源代码,但最终得到了相同的结果

这是我的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);
    }
}
}

堆栈跟踪中的消息已向您解释了该问题:

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

这说明您正在尝试操作视图,例如从非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);
         }
    });
}