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

时间:2016-02-15 20:17:15

标签: java android html http

我正在创建一个可以获取网站HTML的应用程序,但到目前为止我发现的所有方法都返回错误。我为清单添加了互联网权限,但没有做任何事情。我的代码如下所示:

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) 

2 个答案:

答案 0 :(得分:1)

是的,你得到的异常是因为你试图在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();

答案 1 :(得分:0)

您应该在后台线程中进行网络调用。 试试这个代码。 :)

        public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        public void myAction(View view) {
           new Test().execute();
            }

        //AsyncTask 
        class Test extends AsyncTask<String, Void, String>{

            @Override
            protected String doInBackground(String... params) {
       InputStream in = null;
    String queryResult = "";
    URL url = new URL("http://www.android.com/");
   HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
   try {
     InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    queryResult= readStream(in);
        }
    finally {
     urlConnection.disconnect();
   }
          return queryResult;

            }
        private String readStream(InputStream iStream) throws IOException {

    //Buffered reader allows us to read line by line
    try (BufferedReader bReader =
                 new BufferedReader(new InputStreamReader(iStream))){
        StringBuilder builder = new StringBuilder();
        String line;
        while((line = bReader.readLine()) != null) {  //Read till end
            builder.append(line);
        }
        return builder.toString();
    }
}
            protected void onPostExecute(String data) {
             // do further things 
Toast toast = Toast.makeText(getApplicationContext(),data,
    Toast.LENGTH_SHORT);
toast.show();

          }

        }

        }