Android 通过JDBC连接到PostgreSQL-NetworkOnMainThreadException

Android 通过JDBC连接到PostgreSQL-NetworkOnMainThreadException,android,postgresql,jdbc,Android,Postgresql,Jdbc,我终于设法访问了postgres,但方法不符合要求。通过第一种方法我可以连接,但通过第二种方法我收到以下错误 这是我的密码 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.la

我终于设法访问了postgres,但方法不符合要求。通过第一种方法我可以连接,但通过第二种方法我收到以下错误

这是我的密码

public class MainActivity extends Activity {

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

        Button login = (Button) findViewById(R.id.Connect);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //new JSONTask().execute("file:///C:/Users/intel/Desktop/details.json");
                System.out.println("Connection Start");
                new PostgreSqlJDBC().execute();
            }
        });
    }

    public class PostgreSqlJDBC extends AsyncTask<Void, Void, Void> {
        @Override
        public Void doInBackground(Void... params) {
            Connection conexion = null;
            System.out.println("Connection Intitializing");
            try {
                Class.forName("org.postgresql.Driver");
                String url="jdbc:postgresql://192.168.0.5:5432/Taxi";
                conexion = DriverManager.getConnection(url, "admin", "123");
                System.out.println("Connection Successfull");
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println(e.getMessage());
                System.err.println("Error: Cant connect!");

                System.err.println("----- PostgreSQL query ends correctly!-----");
                return null;
            }
            return null;
        }


    }

}
在控制台中记录输出

    09-13 00:08:10.990    6948-6948/? I/System.out﹕ Connection Intitializing
09-13 00:08:10.993    1233-1294/? W/AudioTrack﹕ AUDIO_OUTPUT_FLAG_FAST denied by client
09-13 00:08:11.079    6948-6948/? W/System.err﹕ org.postgresql.util.PSQLException: Something unusual has occurred to cause the driver to fail. Please report this exception.
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at org.postgresql.Driver.connect(Driver.java:295)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at java.sql.DriverManager.getConnection(DriverManager.java:179)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at java.sql.DriverManager.getConnection(DriverManager.java:213)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at com.echotaxicab.MainActivity.Connect(MainActivity.java:42)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at android.view.View$1.onClick(View.java:4015)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at android.view.View.performClick(View.java:4780)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at android.view.View$PerformClick.run(View.java:19866)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5257)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ Caused by: android.os.NetworkOnMainThreadException
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:154)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at java.net.Socket.connect(Socket.java:882)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at org.postgresql.core.PGStream.<init>(PGStream.java:64)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:147)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:218)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at org.postgresql.Driver.makeConnection(Driver.java:407)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ at org.postgresql.Driver.connect(Driver.java:275)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ ... 16 more
09-13 00:08:11.081    6948-6948/? W/System.err﹕ Something unusual has occurred to cause the driver to fail. Please report this exception.
09-13 00:08:11.081    6948-6948/? W/System.err﹕ Error: Cant connect!
09-13 00:08:11.081    6948-6948/? W/System.err﹕ ----- PostgreSQL query ends correctly!-----
09-13 00:08:10.990 6948-6948/?I/System.out﹕ 连接初始化
09-13 00:08:10.993    1233-1294/? 带音轨﹕ 音频\u输出\u标志\u快速被客户端拒绝
09-13 00:08:11.079    6948-6948/? W/System.err﹕ org.postgresql.util.psqleexception:发生了一些异常情况,导致驱动程序失败。请报告此异常。
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于org.postgresql.Driver.connect(Driver.java:295)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于java.sql.DriverManager.getConnection(DriverManager.java:179)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于java.sql.DriverManager.getConnection(DriverManager.java:213)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 在com.echotaxicab.MainActivity.Connect上(MainActivity.java:42)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于java.lang.reflect.Method.invoke(本机方法)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于java.lang.reflect.Method.invoke(Method.java:372)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 在android.view.view$1.onClick(view.java:4015)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 在android.view.view.performClick上(view.java:4780)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 在android.view.view$PerformClick.run(view.java:19866)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于android.os.Handler.handleCallback(Handler.java:739)
09-13 00:08:11.079    6948-6948/? W/System.err﹕ 位于android.os.Handler.dispatchMessage(Handler.java:95)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于android.os.Looper.loop(Looper.java:135)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于android.app.ActivityThread.main(ActivityThread.java:5257)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于java.lang.reflect.Method.invoke(本机方法)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于java.lang.reflect.Method.invoke(Method.java:372)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)上
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 原因:android.os.NetworkOnMainThreadException
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 在libcore.io.BlockGuardOs.connect上(BlockGuardOs.java:110)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 在libcore.io.IoBridge.ConnecterNo(IoBridge.java:154)中
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于libcore.io.IoBridge.connect(IoBridge.java:122)
09-13 00:08:11.080    6948-6948/? W/System.err﹕ 位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于java.net.Socket.connect(Socket.java:882)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于org.postgresql.core.PGStream(PGStream.java:64)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:147)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于org.postgresql.jdbc.PgConnection.(PgConnection.java:218)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于org.postgresql.Driver.makeConnection(Driver.java:407)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 位于org.postgresql.Driver.connect(Driver.java:275)
09-13 00:08:11.081    6948-6948/? W/System.err﹕ ... 还有16个
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 发生了一些异常情况,导致驾驶员出现故障。请报告此异常。
09-13 00:08:11.081    6948-6948/? W/System.err﹕ 错误:无法连接!
09-13 00:08:11.081    6948-6948/? W/System.err﹕ ----- PostgreSQL查询正确结束-----

也许问题就在这里

android.system.ErrnoException: socket failed: EACCES (Permission denied)
确保您具有internet权限,例如:

<uses-permission android:name="android.permission.INTERNET"/>

很高兴OP解决了权限问题


我相信这些注释已经足够清楚了,可以不使用主线程来执行此操作。

您的按钮的onClick处理程序(以及反过来您的Connect(View)方法)在主(UI)线程上被调用。因此,您的第二个代码示例是在主线程上调用DriverManager.getConnection,这在Android中是不允许的


您的第一个代码示例之所以有效,是因为您已将对DriverManager.getConnection的调用卸载到后台线程(通过AsyncTask)。

您知道不建议在Android上使用JDBC连接,是吗?那么从Android studio访问数据库的正确方法是什么呢,我只想说Android Studio只是一个IDE,您可以在其中编写代码,它不连接到数据库。建议使用RESTAPI。与数据库运行在同一(或不同)服务器上的web服务器将运行连接。这样可以对数据库进行更安全、更干净、更健壮的查询,并防止应用程序中数据库代码膨胀。使用AsyncTask的第一个代码是正确的。我不知道你为什么在第二段代码中去掉它。另外,我认为我最初的答案是正确的,这促使你编辑并使用
DriverManager.getConnection(url,“admin”,“123”)并最终更改问题。请不要这样做,因为这会使现有答案无效。相反,你应该接受他们并发表一篇新文章。
<uses-permission android:name="android.permission.INTERNET"/>