1

jdbc ドライバーを使用して、Android アプリケーションを mysql データベースに接続しようとしています。よく検索したところ、スレッドまたは AsyncTask を使用して mysql に直接接続できることがわかりました。しかし、私は asynctask で難しいと思ったので、それを行うためにスレッドを使用しています。これが私のコードです:

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

スレッド内にトーストを表示しています。ui スレッドで ui を更新する必要があります。

内部スレッドの run メソッド use runOnUiThread. runOnUiThreadアクティビティ クラスのメソッドです。@オーバーライドを追加

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

asynctask も使用できます。

于 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

これを試して...

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

スレッドが機能を終了するまで待つ必要があります。

于 2013-09-19T10:10:30.370 に答える
0

コードを見ると、例外が生成されていることがわかりますが、コードの実行中に目に見える強制終了が発生していないようにキャッシュされています。

レイアウト内のテキストボックスを簡単に取り、そのテキストを応答として設定してみてください。これにより、JDBC またはデータベースに問題がないことが確認されます。

それが成功した場合、ここでは AsynTask を使用するのが最適です。

于 2013-09-19T10:01:06.500 に答える