gpt4 book ai didi

java - HTTP请求返回非法状态异常android

转载 作者:可可西里 更新时间:2023-11-01 17:34:33 24 4
gpt4 key购买 nike

我正在创建一个将获取网站 HTML 的应用程序,但到目前为止,我发现的所有方法都会返回错误。我向 list 添加了互联网权限,但什么也没做。我的代码如下所示:

package com.ruralsurvivor.remoteapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.net.*;
import java.io.BufferedInputStream;
import java.io.*;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void myAction(View view) {
try {
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

InputStream in = new BufferedInputStream(urlConnection.getInputStream());
} catch (java.io.IOException e) {

}
}
}

错误看起来像这样:

02-15 14:12:36.155 13617-13617/com.ruralsurvivor.remoteapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ruralsurvivor.remoteapp, PID: 13617
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:4036)
at android.view.View.performClick(View.java:4806)
at android.widget.CompoundButton.performClick(CompoundButton.java:120)
at android.view.View$PerformClick.run(View.java:19983)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5725)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1030)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4031)
at android.view.View.performClick(View.java:4806) 
at android.widget.CompoundButton.performClick(CompoundButton.java:120) 
at android.view.View$PerformClick.run(View.java:19983) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:155) 
at android.app.ActivityThread.main(ActivityThread.java:5725) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1030) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825) 
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1155)
at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:403)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:353)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:220)
at com.ruralsurvivor.remoteapp.MainActivity.myAction(MainActivity.java:22)
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at android.view.View$1.onClick(View.java:4031) 
at android.view.View.performClick(View.java:4806) 
at android.widget.CompoundButton.performClick(CompoundButton.java:120) 
at android.view.View$PerformClick.run(View.java:19983) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:155) 
at android.app.ActivityThread.main(ActivityThread.java:5725) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 

最佳答案

是的,您遇到的异常是因为您试图在 UI 线程上执行冗长的网络操作。这是有问题的,因为它可能会在您尝试执行请求时停止您的 UI 功能。下面是我用来准确获取您需要的内容的类:

import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HTTPRequest extends AsyncTask< String, String, String >
{

protected String theHTTPString = null;

@Override
protected String doInBackground( String... uri )
{
URL url = null;
try
{
url = new URL( uri[0] );
}
catch( MalformedURLException e )
{
e.printStackTrace();
}

String responseString = null;
try
{
HttpURLConnection httpclient = (HttpURLConnection) url.openConnection();

int lResponseCode = httpclient.getResponseCode();
if( lResponseCode != HttpURLConnection.HTTP_OK )
{
httpclient.disconnect();
throw new IOException( "RESPONSE REJECTED WITH ERROR CODE: " + lResponseCode );
}
BufferedReader in = new BufferedReader(new InputStreamReader( httpclient.getInputStream() ));
StringBuffer lStringBuffer = new StringBuffer();
String inputLine;
while( (inputLine = in.readLine()) != null )
{
lStringBuffer.append( inputLine );
}
httpclient.disconnect();
in.close();
responseString = lStringBuffer.toString();
}
catch( IOException e )
{
e.printStackTrace();
return responseString;
}
theHTTPString = responseString;
return responseString;
}
}

然后你可以这样做:

String lResponse = new HTTPRequest().execute( pURL ).get();

关于java - HTTP请求返回非法状态异常android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com