1

我正在尝试使用 jdbc 驱动程序将我的 android 应用程序与 mysql 数据库连接起来。查了很多,发现使用thread或者AsyncTask可以直接连接mysql。但是我发现异步任务很困难,所以我使用线程来做到这一点。这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_customer);
    TextView t = (TextView) findViewById(R.id.Search_Customer_textView1);
    Button b = (Button) findViewById(R.id.Search_Customer_button1);
    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            Thread timer=new Thread(){
                public void run(){
                    try {
                        Class.forName("com.mysql.jdbc.Driver");
                        con = DriverManager.getConnection("jdbc:mysql://192.168.1.102:3306/outsidelaundry", "root", "");
                        Statement stmt = con.createStatement();
                        String query = "select Name from nonmember";
                        ResultSet rs = stmt.executeQuery(query);        
                        while(rs.next())
                        {
                            val = val + rs.getString(1) + "\n";
                        }
                        Toast.makeText(getApplicationContext(), val, Toast.LENGTH_LONG).show();
                        con.close();

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            timer.start();
            Toast.makeText(getApplicationContext(), "pressed", Toast.LENGTH_LONG).show();
        }
    });

    }

当我运行程序线程没有启动/运行。我没有得到任何异常。请帮我解决一下这个。

4

4 回答 4

3

您正在线程内显示 Toast。您应该在 ui 线程上更新 ui。

内部线程的运行方法使用runOnUiThread. runOnUiThread是您的活动类的方法。添加@Override

    Thread timer=new Thread(){
        @Override
        public void run(){
          Log.i("Thread","Running"); 
          // you should see the log message if the thread runs
            try {

                    // do othere operations
                runOnUiThread(new Runnable() {
                        @Override 
                    public void run() {
                        // dispaly toast here;
                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    timer.start();

您也可以使用异步任务。

于 2013-09-19T10:01:44.783 回答
1

您需要在runOnUiThread()方法上调用 Toast

activity.runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(getApplicationContext(), val, Toast.LENGTH_LONG).show();
    }
});
于 2013-09-19T10:01:33.940 回答
0

通过查看您的代码,我可以看到正在生成异常,但是您已将其缓存,因此在运行代码时不会发生可见的强制关闭。

简单地接受布局中的文本框,并尝试将文本设置为响应。这确认您对 JDBC 或数据库没有问题。

如果成功,那么 AsynTask 是最好的选择。

于 2013-09-19T10:01:06.500 回答
0

试试这个...

  try{
     timer.join();
      }  
   catch (Exception e) {
                    e.printStackTrace();
                }

我们必须等到线程完成它的工作。

于 2013-09-19T10:10:30.370 回答