通过 JDBC 连接到 PostgreSQL - NetworkOnMainThreadException [重复]
Posted
技术标签:
【中文标题】通过 JDBC 连接到 PostgreSQL - NetworkOnMainThreadException [重复]【英文标题】:Connecting to PostgreSQL through JDBC - NetworkOnMainThreadException [duplicate] 【发布时间】:2016-09-12 17:58:08 【问题描述】:我终于设法访问了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;
但我想通过这种方式访问它。 CONNECT 方法是对 xml 中的按钮的引用。
public class MainActivity extends Activity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
public void Connect(View v)
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!-----");
在控制台中记录输出。
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!-----
【问题讨论】:
你知道不建议在Android上使用JDBC连接,是吗? 那么从android studio访问数据库的正确方法是什么? 首先,我只想说Android Studio只是一个你编写代码的IDE——它不连接到数据库。推荐的方式是 REST API。在与数据库相同(或不同)的服务器上运行的 Web 服务器将运行连接。这提供了对数据库进行更安全、更清晰和更健壮的查询,并防止您的应用程序中的数据库代码膨胀。 您使用 AsyncTask 的第一个代码是正确的方法。我不知道你为什么在第二个代码块中去掉它。 另外,我认为我最初的答案是正确的,这促使您编辑和使用DriverManager.getConnection(url, "admin", "123");
并最终改变了问题。请不要这样做,因为它会使现有答案无效。相反,您应该接受它们并发布新帖子。
【参考方案1】:
您的按钮的 onClick 处理程序(以及您的 Connect(View) 方法)在主 (UI) 线程上调用。因此,您的第二个代码示例是在主线程上调用 DriverManager.getConnection,这在 Android 中是不允许的。
您的第一个代码示例有效,因为您已将对 DriverManager.getConnection 的调用卸载到后台线程(通过 AsyncTask。)
【讨论】:
【参考方案2】:也许问题就在这里
android.system.ErrnoException: socket failed: EACCES (Permission denied)
确保您拥有互联网权限,例如:
<uses-permission android:name="android.permission.INTERNET"/>
很高兴 OP 修复了权限问题。
而且我相信 cmets 已经足够清楚,不使用主线程来执行此操作。
【讨论】:
以上是关于通过 JDBC 连接到 PostgreSQL - NetworkOnMainThreadException [重复]的主要内容,如果未能解决你的问题,请参考以下文章
通过带有 SSL 的 JDBC 连接到 Google Cloud PostgreSQL
如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?
通过 jdbc 驱动程序和 h2console.war 连接到 postgresql