getResponseCode()에 대한 오류
4756 단어 Android
// 2. ,
public void click(View v) {
try {
// 2.1
String path = et_path.getText().toString().trim();
// 2.2 URL , ( )
URL url = new URL(path);
// 2.3 httpurlconnection ,
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 2.4 get
conn.setRequestMethod("GET"); // get , get
// 2.5
conn.setConnectTimeout(5000);
// 2.6
int code = 0;
code = conn.getResponseCode();
// 2.7 code==200
Log.d(TAG, code + "====================================");
if (code == 200) {
// 2.8 , ,
// Utils
InputStream in = conn.getInputStream();
// 2.9 in String
String content = StreamTools.readStream(in);
tv_result.setText(content);
}
} catch (MalformedURLException e) {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
버림 예외:Caused by:android.os.NetworkOnMainThreadException
솔루션: Oncreate() 메서드에
시나리오 1:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
시나리오 2:
다음과 같이 새 스레드를 실행합니다.
new Thread() {
public void run() {
try {
// 2.1
String path = et_path.getText().toString().trim();
// 2.2 URL , ( )
URL url = new URL(path);
// 2.3 httpurlconnection ,
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 2.4 get
conn.setRequestMethod("GET"); // get , get
// 2.5
conn.setConnectTimeout(5000);
// 2.6
int code = 0;
code = conn.getResponseCode();
// 2.7 code==200
Log.d(TAG, code + "====================================");
if (code == 200) {
// 2.8 , ,
// Utils
InputStream in = conn.getInputStream();
// 2.9 in String
String content = StreamTools.readStream(in);
tv_result.setText(content);
}
} catch (MalformedURLException e) {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}.start();
버튼을 누르면 결과가 나오지만, 플래시, 이상 던지기android가 나타납니다.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.잘못된 스레드에서 UI를 업데이트하는 방법에 대해 설명합니다.
Android에서 관련된view와 컨트롤 작업은 모두 라인이 안전하지 않기 때문에 Android는 비 UI 라인에서 UI를 업데이트하는 것을 금지한다. 예를 들어Activity에서 직접 하위 라인을 만들고 하위 라인에서 UI를 직접 조작하는 등 현시적인 불법 작업에 대해 Android는 이상적으로 종료하고 should run on UIthread와 같은 오류 로그 정보를 알린다.그러나 스텔스 방식의 불법 조작에 대해 App은 직접적이고 난폭하게 이상하게 탈퇴하지 않는다. 단지 이상한 결과가 나타날 뿐이다. Only the original thread that created a view hierarchy can touch its views는 하나의 예이다. 글자의 뜻은 보기 차원 구조를 만드는 원래의 라인만 그의 View를 조작할 수 있다는 것이다. 이것은 라인 안전과 관련된 것이 분명하다.
요약 정보:
네트워크 연결, 빅데이터 복사, 절전 등 주 스레드(UI 스레드)에서는 시간이 많이 걸리는 작업을 할 수 없습니다.
예를 들면 구글 네트워크를 연결하는 것이다.warning:java.net.SocketTimeoutException: connect timed out
주 스레드 시간 초과 info: The application may be doing too much work on its main thread.
4.0 이후 구글은 네트워크 연결을 강제로 메인 라인에서 접근할 수 없게 했다
주 스레드(UI 스레드)만 UI 업데이트 가능
=================================Talk is cheap, show me the code===============================
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.