2015-02-23 82 views
0

我希望收到来自URL的404错误,但我一直使用的代码产生一个错误:收到404错误的Android

public String getRespond(String request) { 

    try{ 
     URL url=new URL (request); 
     URLConnection connection=url.openConnection(); 
     InputStream in=new BufferedInputStream(connection.getInputStream()); 

     Scanner scanner =new Scanner(in); 
     String response=scanner.nextLine(); 
     scanner.close(); 
     return response; 

    } 
    catch (Exception e){ 
     return null; 
    } 
} 

错误是在“中新= ...” ,并且我不可能知道是否有404错误。 这是错误:

02-23 11:42:42.869 20413-20413/com.mappleapps.tm2ibz E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.mappleapps.tm2ibz, PID: 20413 
android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1156) 
     at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
     at java.net.InetAddress.getAllByName(InetAddress.java:214) 
     at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28) 
     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216) 
     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122) 
     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 
     at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 

谢谢!

+0

什么错误?你应该提供'LogCat'输出,所以我们可以帮你 – Gorcyn 2015-02-23 10:35:12

+0

要检查是否有404错误,你应该在输入流之前使用connection.getResponseCode(),它会返回响应的编号(比如200,400, 404 ...) – programmer23 2015-02-23 10:36:49

+0

@Gorcyn对不起,我编辑了错误的帖子!谢谢! – avilalta92 2015-02-23 10:47:45

回答

1

应用程序的主线程不再允许HTTP请求。

所以,你应该使用并行Thread,或者更简单的AsyncTask

class ResponseTask extends AsyncTask<String, Void, String> { 

    public static interface ResponseTaskListener { 
     void onResponse(String response); 
     void onException(Exception e); 
    } 

    private ResponseTaskListener listener; 
    private Exception e; 

    public ResponseTask(ResponseTaskListener listener) { 
     this.listener = listener; 
    } 

    protected String doInBackground(String... urls) { 
     try { 
      String request = urls[0]; 

      URL url=new URL (request); 
      URLConnection connection=url.openConnection(); 
      InputStream in=new BufferedInputStream(connection.getInputStream()); 

      Scanner scanner =new Scanner(in); 
      String response=scanner.nextLine(); 
      scanner.close(); 
      return response; 

     } catch (Exception e){ 
      this.e = e; 
      return null; 
     } 
    } 

    // String response = what is returned by doInBackground 
    protected void onPostExecute(String response) { 
     if (this.listener != null) { 
      if (this.e != null) { 
       this.listener.onException(this.e); 
      } else { 
       this.listener.onResponse(response); 
      } 
     } 
    } 
} 

然后才能执行此请求,你可以:

new ResponseTask(new ResponseTaskListener() { 
    public void onResponse(String response) { 
     // Play with the response 
    } 
    public void onException(Exception e) { 
     // Play with the exception 
    } 
}).execute(urlToRssFeed); 
+0

当我使用这段代码时,在InputStream中= new ...总是在catch异常中输入,并且响应为空。 – avilalta92 2015-02-24 08:40:32

+0

如果你在'catch'块中添加Log.e(“ERROR”,e.getMessage(),e);'' – Gorcyn 2015-02-24 08:58:15

+0

对于'LogCat',你会得到什么?对不起,我已经解决了这个问题, !谢谢!!! – avilalta92 2015-02-24 09:57:17