Java Can';在android中不能发出http请求
我正在尝试制作一个简单的android应用程序,向谷歌发出请求,我的应用程序应该连接到谷歌然后停止,我得到了什么错误Java Can';在android中不能发出http请求,java,android,Java,Android,我正在尝试制作一个简单的android应用程序,向谷歌发出请求,我的应用程序应该连接到谷歌然后停止,我得到了什么错误 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 4431 java.lang.IllegalStateException: Could not execute method for android:onClick at androidx
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 4431
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
at android.view.View.performClick(View.java:7339)
at android.widget.TextView.performClick(TextView.java:14275)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:7305)
at android.view.View.access$3200(View.java:846)
at android.view.View$PerformClick.run(View.java:27787)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7078)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:7339)
at android.widget.TextView.performClick(TextView.java:14275)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:7305)
at android.view.View.access$3200(View.java:846)
at android.view.View$PerformClick.run(View.java:27787)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7078)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
at java.net.InetAddress.getAllByName(InetAddress.java:1154)
at com.android.okhttp.Dns$1.lookup(Dns.java:39)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:196)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:89)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:190)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:142)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:104)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:392)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:325)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:488)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
at com.example.myapplication.HttpRequest.request(HttpRequest.java:25)
at com.example.myapplication.MainActivity.onClick(MainActivity.java:64)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:7339)
at android.widget.TextView.performClick(TextView.java:14275)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:7305)
at android.view.View.access$3200(View.java:846)
at android.view.View$PerformClick.run(View.java:27787)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7078)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
我正在使用API 30开发android studio 4.1.2,我正在使用android 9 Pie在手机上运行应用程序。
我的应用程序有一个按钮可以发出请求,正在执行的按钮就在这里:
public void onClick(View view) {
try {
URL url = new URL("http://www.google.com/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
//do something
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
我尝试了在internet上找到的解决方案,但没有任何效果,我尝试编辑我的AndroidManifest.xml,结果是:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity android:name=".MainActivity2"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我创建了一个文件network\u security\u config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">google.com</domain>
</domain-config>
</network-security-config>
谷歌网站
我是移动开发新手,我不了解xml文件中的所有内容,所以可能有明显的错误,但我看不到
谢谢您的帮助。根据您的错误日志,您的问题是您正试图通过主线程连接到internet。Android不允许您在主线程上设置internet连接,因为这样会在建立连接时冻结所有其他内容。您需要在不同的线程上连接
编辑:鉴于
AsyncTask
被贬低,推荐的替代方案似乎是使用java.util.concurrent
中包含的接口为Kotlin创建线程和/或线程池或协同程序库。请务必检查文档,并创建一个在后台建立连接的线程。在调用onClick(即xml etcD)的位置共享该线程是否可以解决您的问题?是的,谢谢您,这很有帮助,但我仍在为AsyncTask寻找一个好的解决方案,因为AsyncTask已被弃用。AsyncTask
现在已被弃用。我不推荐这种方法。不过,诊断似乎是正确的。谢谢。现在我明白了问题所在,但除此之外还有更好的解决方案吗AsyncTask@HenryTwist谢谢你让我知道。没有问题,目前的建议是使用Java并发或Kotlin协同程序库。也许可以更新您的答案@Nordii,改为这样说?