2016-01-14 81 views
0

我試圖連接MySQL數據庫使用AsyncTask使用AsyncTask與Android Studio連接到Android應用程序的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) 
01-14 12:20:53.510 18010-18010/slv.com.loginapp W/System.err:  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
+0

您是在物理設備上還是在仿真器上測試? –

+0

物理設備.. –

+0

然後您將需要使用私有IP地址(例如:192.168.x.x系列IP地址)而不是'localhost'。你還需要確保你的網絡上有你所使用的_server_,WAMP或XAMPP。 –

回答

0

如果您使用外部物理設備,應該添加機器的IP地址而不是'localhost'。

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

它的連接字符串

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

從移動,你需要設置你需要允許MySQL的服務器上遠程連接,如果它尚未啓用服務器IP或主機名,不localhost

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

還,您需要向谷歌。

+0

謝謝你..我得到了D解決方案...如何允許遠程連接在MySQL服務器?? –

+0

你可以谷歌它,或檢查這個答案http://stackoverflow.com/questions/14779104/how-to-allow-remote-connection-to-mysql – Yazan

+0

好吧檢查出來 –

2

這裏有兩個問題。首先,這是主機名的問題。你告訴它連接到本地主機。該數據庫不在您的手機上,所以這是錯誤的地址。

第二次,雖然修復#1將使它的工作,這是一個不好的做事方式。你的所有客戶的手機上都會有你的數據庫的密碼嵌入到你的應用程序中。這意味着密碼可以被簡單地反編譯和使用。您不應該直接通過任何不屬於您的硬件連接到數據庫。相反,您應該在您控制的計算機上使用Web服務,並將其放在您的數據庫和手機之間。然後通過webservice訪問數據庫。這樣你的數據庫的密碼永遠不會超出你的控制範圍。

+0

即時通訊新的android和web服務,而我只是爲了練習的目的..你有沒有任何標準的參考代碼? –