android.os.NetworkOnMainThreadException

来源:2-1 http协议

痕禾

2018-12-24 11:56:30

 android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
        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.connect(HttpURLConnectionImpl.java:89)

                at com.zhenio.ping.urlapp.MainActivity$1.onClick(MainActivity.java:46)
package com.zhenio.ping.urlapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = ".MainActiviyt";
    private Button get_btn,parse_btn;
    private TextView view_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        get_btn = findViewById(R.id.get_btn);
        parse_btn = findViewById(R.id.parse_btn);
        get_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    URL url = new URL("http://www.imooc.com/api/teacher?type=2&page=1");
                    //打开网络管理器
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    //设置超时时间
                    connection.setConnectTimeout(30*1000);
                    //设置请求方法
                   connection.setRequestMethod("GET");
                    //设置请求头类型
                    connection.setRequestMethod("GET");
                    connection.setRequestProperty("Content-Type", "application/json");
                    connection.setRequestProperty("Charset", "UTF-8");
                    connection.setRequestProperty("Accept-Charset", "UTF-8");
                    //发起链接
                    connection.connect();

                    //
                    int responseCode = connection.getResponseCode();
                    String message = connection.getResponseMessage();
                    //
                    ByteArrayOutputStream baos = null;
                    if (responseCode == HttpURLConnection.HTTP_OK){
                        InputStream inputStream = connection.getInputStream();
                        baos = new ByteArrayOutputStream();
                        byte[] buffer = new byte[1024];
                        int len;
                        while((len = inputStream .read(buffer))!= -1){
                            baos.write(buffer);
                        }
                        inputStream.close();
                       final  byte [] byteArray = baos.toByteArray();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                view_text.setText(new String(byteArray));
                            }
                        });

                    }else{
                        Log.i(TAG, "run: error code:" +responseCode +", message:" +message);

                    }
                    baos.close();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        });
    }
}
这里的46行是
//发起链接
connection.connect();  这个错误的原因是什么???E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.zhenio.ping.urlapp, PID: 1674
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
写回答

2回答

irista23

2018-12-24

网络操作不能在主线程中,应该单开一个子线程,在其中操作。

0

痕禾

提问者

2018-12-24

这里为什么是?需要两个线程??

0
hrista23
h runOnUiThread()是在子线程中调用,但Runnable对像是在ui程序中被调用的。
h018-12-24
共1条回复

0 学习 · 1613 问题

查看课程