我正在创建一个可以获取网站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)
答案 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();
}
}
}