Android 上的 .connect() 程序崩溃,无法连接

问题描述 投票:0回答:1

我已经尝试解决这个问题好几个小时了。我已经寻找答案,但找不到答案。我以前从来没有费心去问,这是我第一次问问题。基本上我正在做的就是为了组织目的而分解我的编码。下面的代码片段工作得很好,但是当我将它放入另一个类中时, urlConnect();连接得很好。我已经在下面标记了。

public String downloadUrl(String strUrl) throws IOException{
    String data = "";
    InputStream iStream = null;
    HttpURLConnection urlConnection = null;

    try{
        URL url = new URL(strUrl);
        String line = "";

        // Creating an http connection to communicate with url 
        urlConnection = (HttpURLConnection) url.openConnection();

        /* Connecting to url */
        urlConnection.connect(); <-------------------------works in this snippet

        /* Reading data from url */
        iStream = urlConnection.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
        StringBuffer sb  = new StringBuffer();

        while((line = br.readLine()) != null){
            sb.append(line);
        }
        data = sb.toString();
        br.close();
    }
    catch(Exception e){
        Log.d("Exception while downloading url", e.toString());
    }
    finally {
        iStream.close();
        urlConnection.disconnect();
    }
    return data;
}

所以下面的代码片段几乎是相同的。但由于某种原因它不想连接:

public String getJSONobject(String strUrl) throws IOException{
    String data = "";
    InputStream iStream = null;
    HttpURLConnection urlConnection = null;

    try{
        URL url = new URL(strUrl);
        String line = "";
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.connect();    <------------------ Does not work

        iStream = urlConnection.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
        StringBuffer sb  = new StringBuffer();

        while((line = br.readLine()) != null){
            sb.append(line);
        }
        data = sb.toString();
        br.close();
        iStream.close();    
    }               
    catch (MalformedURLException e1) {
        e1.printStackTrace();
    } 
    catch (IOException e1) {
        e1.printStackTrace();
    } 
    finally {
        if(null != urlConnection) { urlConnection.disconnect(); 
    }
    return data;

LogCat:

>at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1131)
>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 libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
>at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
>at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
>at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
>at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
>at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
>at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
>at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
>at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
>at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
>at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
>at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)
>at com.navsquad.shsu.katlas2.RouteJSONobject.getJSONobject(RouteJSONobject.java:57)
>at com.navsquad.shsu.katlas2.CreateRoute.create(CreateRoute.java:41)
>at com.navsquad.shsu.katlas2.MainActivity$3.onMapClick(MainActivity.java:84)
>at com.google.android.gms.maps.GoogleMap$6.onMapClick(Unknown Source)
>at com.google.android.gms.internal.t$a.onTransact(Unknown Source)
>at android.os.Binder.transact(Binder.java:326)
>at com.google.android.gms.maps.internal.IOnMapClickListener$Stub$Proxy.onMapClick(IOnMapClickListener.java:93)
>at maps.i.s.b(Unknown Source)
>at maps.y.v.c(Unknown Source)
>at maps.y.bf.onSingleTapConfirmed(Unknown Source)
>at maps.d.v.onSingleTapConfirmed(Unknown Source)
>at maps.d.j.handleMessage(Unknown Source)
>at android.os.Handler.dispatchMessage(Handler.java:99)
>at android.os.Looper.loop(Looper.java:137)
>at android.app.ActivityThread.main(ActivityThread.java:5059)
>at java.lang.reflect.Method.invokeNative(Native Method)
>at java.lang.reflect.Method.invoke(Method.java:511)
>at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
>at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
>at dalvik.system.NativeStart.main(Native Method)

再次澄清一下,我所做的只是为我自己的组织创建一个单独的课程。最初我包含了一个解析器,但现在我将它分成了不同的类,因此我可以将其他解析器与字符串/JSON 对象一起使用。如果您能帮我找出与以前不同的地方,我将不胜感激。原始类位于已实现的 AsyncTask 类中。

java android httpconnection
1个回答
7
投票
android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1131)

您似乎尝试在应用程序的 UI 线程上调用阻塞网络 api。

在Android 3.0及以上版本中有一个新的应用程序策略,不允许在主线程上执行网络调用。

请浏览http://developer.android.com/reference/android/os/StrictMode.html

您可以通过添加以下代码片段来禁用严格模式。(我不会在生产环境中推荐这种方法。)

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
© www.soinside.com 2019 - 2024. All rights reserved.