我正在尝试使用 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)
答案 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");