使用AsyncTask与Android Studio进行MySQL连接

时间:2016-01-14 07:05:30

标签: java android android-studio jdbc android-asynctask

我正在尝试使用 AsyncTask 连接MySQL数据库

我将MySQL连接代码放在 AsyncTask 中,如下所示,但它给了我com.mysql.jdbc.CommunicationsException例外,我该如何解决?

MainActivity类:

public class MainActivity extends ActionBarActivity { 

    private EditText username;
    private EditText password;
    private Button login;
    private TextView loginLockedTV;
    private TextView attemptsLeftTV;
    private TextView numberOfRemainingLoginAttemptsTV;
    int numberOfRemainingLoginAttempts = 3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        username = (EditText) findViewById(R.id.usernameET);
        password = (EditText) findViewById(R.id.passwordET);
        login = (Button) findViewById(R.id.loginBtn);
        loginLockedTV = (TextView) findViewById(R.id.loginLockedTV);
        attemptsLeftTV = (TextView) findViewById(R.id.attemptsLeftTV);
        numberOfRemainingLoginAttemptsTV = (TextView) findViewById(R.id.numberOfRemainingLoginAttemptsTV);
        numberOfRemainingLoginAttemptsTV.setText(Integer.toString(numberOfRemainingLoginAttempts));

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //new JSONTask().execute("file:///C:/Users/intel/Desktop/details.json");
                new JSONTask().execute(username.getText().toString(),password.getText().toString());
            }
        });
    }

    private class JSONTask extends AsyncTask<String, String, String>{
        @Override
        protected String doInBackground(String... params) {
            Connection con=null;
            PreparedStatement ps=null;
            ResultSet rs=null;
            String count="0";
            try {
                Class.forName("com.mysql.jdbc.Driver");
                con= DriverManager.getConnection("jdbc:mysql://localhost:3306/androidlogin", "root", "root");
                ps=con.prepareStatement("select count(*) from user where username='"+params[0]+"' and password='"+params[1]+"'");
                System.out.println(ps);
                rs=ps.executeQuery();
                while(rs.next()){
                    count=rs.getString(1);
                }
                return count;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            System.out.println("result: " + result);
            try {
                if (result.equals("1")) {
                    numberOfRemainingLoginAttempts=3;
                    Intent i = new Intent(getApplicationContext(), Main2Activity.class);
                    i.putExtra("username", username.getText().toString());
                    i.putExtra("json",result.split("-")[2]);
                    startActivity(i);

                    Toast.makeText(getApplicationContext(), "Hello admin!", Toast.LENGTH_SHORT).show();
//                    label.setVisibility(View.VISIBLE);
//                    label.setText(result);

                } else {
                    Toast.makeText(getApplicationContext(), "Seems like you 're not admin!", Toast.LENGTH_SHORT).show();
                    numberOfRemainingLoginAttempts--;
                    attemptsLeftTV.setVisibility(View.VISIBLE);
                    numberOfRemainingLoginAttemptsTV.setVisibility(View.VISIBLE);
                    numberOfRemainingLoginAttemptsTV.setText(Integer.toString(numberOfRemainingLoginAttempts));
                }

                if (numberOfRemainingLoginAttempts == 0) {
                    login.setEnabled(false);
                    loginLockedTV.setVisibility(View.VISIBLE);
                    loginLockedTV.setBackgroundColor(Color.RED);
                    loginLockedTV.setText("LOGIN LOCKED!!!");
                }
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "No Internet Connection!", Toast.LENGTH_SHORT).show();
            }
        }
    }

}

控制台上的例外情况:

01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: ** BEGIN NESTED EXCEPTION ** 
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: java.net.SocketException
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: MESSAGE: java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 3306) after 90000ms: isConnected failed: ECONNREFUSED (Connection refused)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: STACKTRACE:
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: java.net.SocketException: java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 3306) after 90000ms: isConnected failed: ECONNREFUSED (Connection refused)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:284)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.Connection.createNewIO(Connection.java:2565)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.Connection.<init>(Connection.java:1485)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:179)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:213)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at slv.com.loginapp.MainActivity$JSONTask.doInBackground(MainActivity.java:60)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at slv.com.loginapp.MainActivity$JSONTask.doInBackground(MainActivity.java:50)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err:     at java.lang.Thread.run(Thread.java:818)
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: ** END NESTED EXCEPTION **
01-14 12:20:53.494 18010-18060/slv.com.loginapp W/System.err: Last packet sent to the server was 123 ms ago.
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.Connection.createNewIO(Connection.java:2631)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.Connection.<init>(Connection.java:1485)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:179)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:213)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at slv.com.loginapp.MainActivity$JSONTask.doInBackground(MainActivity.java:60)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at slv.com.loginapp.MainActivity$JSONTask.doInBackground(MainActivity.java:50)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-14 12:20:53.495 18010-18060/slv.com.loginapp W/System.err:     at java.lang.Thread.run(Thread.java:818)
01-14 12:20:53.495 18010-18010/slv.com.loginapp I/System.out: result: null
01-14 12:20:53.496 18010-18010/slv.com.loginapp W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
01-14 12:20:53.499 18010-18056/slv.com.loginapp D/OpenGLRenderer: DisplayEventReceiver 0x5589169500 requestNextVsync
01-14 12:20:53.504 18010-18056/slv.com.loginapp D/OpenGLRenderer: DisplayEventReceiver 0x5589169500 latestVsyncEvent 118270104073235
01-14 12:20:53.509 18010-18010/slv.com.loginapp W/System.err:     at slv.com.loginapp.MainActivity$JSONTask.onPostExecute(MainActivity.java:80)
01-14 12:20:53.509 18010-18010/slv.com.loginapp W/System.err:     at slv.com.loginapp.MainActivity$JSONTask.onPostExecute(MainActivity.java:50)
01-14 12:20:53.509 18010-18010/slv.com.loginapp W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:632)

3 个答案:

答案 0 :(得分:2)

这里有两个问题。首先,有主机名的问题。您告诉它连接到localhost。数据库不在您的手机上,因此地址错误。

第二个 - 修复#1会使它工作,这是一个糟糕的做事方式。您的所有客户端手机上的应用中都嵌入了数据库密码。这意味着可以简单地反编译和使用密码。您不应该从您不拥有的任何硬件直接连接到数据库。相反,您应该在您控制的计算机上使用Web服务,并将其放在数据库和手机之间。然后通过webservice访问数据库。这样,数据库的密码永远不会受到您的控制。

答案 1 :(得分:1)

这是连接字符串

con= DriverManager.getConnection("jdbc:mysql://localhost:3306/androidlogin", "root", "root");

来自手机,您需要设置服务器IP或主机名,而不是localhost

con= DriverManager.getConnection("jdbc:mysql://MYSQL_SERVER_ADDRESS:3306/androidlogin", "root", "root");

如果还没有启用mysql-server上的远程连接,你需要谷歌那个。

答案 2 :(得分:0)

如果您使用的是外部物理设备,则应添加本机的IP地址而不是“localhost”。

 con = DriverManager.getConnection("jdbc:mysql://192.168.1.143:3306/ccv", "root", "root");