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回答
网络操作不能在主线程中,应该单开一个子线程,在其中操作。
痕禾
提问者
2018-12-24
这里为什么是?需要两个线程??