Android: 네트워크 동작 2.3 등 저 버 전 정상, 4.0 (ICS) 이상 오류, AsyncTask 비동기 스 레 드 get json 으로 변경
7969 단어 AsyncTask
원인: 4.0 이상 의 강제 요 구 는 메 인 스 레 드 에서 시간 이 걸 리 는 네트워크 작업 을 수행 할 수 없습니다. 네트워크 작업 은 Thead + Handler 또는 AsyncTask 를 사용 해 야 합 니 다.
솔 루 션: 네트워크 작업 은 Thead + Handler 또는 AsyncTask 비동기 스 레 드 로 바 꿉 니 다. 본 고 는 AsyncTask 의 사용 방법 을 소개 합 니 다.
1. 클래스 추가:
HttpTask.java
public class HttpTask extends AsyncTask<String, Integer, String> {
private static final String TAG = "HTTP_TASK";
@Override
protected String doInBackground(String... params) {
// Performed on Background Thread
String url = params[0];
try {
String json = new NetworkTool().getContentFromUrl(url);
return json;
} catch (Exception e) {
// TODO handle different exception cases
Log.e(TAG, e.toString());
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String json) {
// Done on UI Thread
if (json != null && json != "") {
Log.d(TAG, "taskSuccessful");
int i1 = json.indexOf("["), i2 = json.indexOf("{"), i = i1 > -1
&& i1 < i2 ? i1 : i2;
if (i > -1) {
json = json.substring(i);
taskHandler.taskSuccessful(json);
} else {
Log.d(TAG, "taskFailed");
taskHandler.taskFailed();
}
} else {
Log.d(TAG, "taskFailed");
taskHandler.taskFailed();
}
}
public static interface HttpTaskHandler {
void taskSuccessful(String json);
void taskFailed();
}
HttpTaskHandler taskHandler;
public void setTaskHandler(HttpTaskHandler taskHandler) {
this.taskHandler = taskHandler;
}
}
NetworkTool.java
public class NetworkTool {
public String getContentFromUrl(String url) {
StringBuilder sb = new StringBuilder();
try {
InputStream is = new URL(url).openStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
is.close();
} catch (final IOException e) {
return null;
}
return sb.toString();
}
}
2. 호출 방법
HttpTask task = new HttpTask();
task.setTaskHandler(new HttpTaskHandler(){
public void taskSuccessful(String json) {
try {
JSONObject jsonObj = new JSONObject(json);
String demo = jsonObj.getString("demo");
} catch (Exception e) {
e.printStackTrace();
}
}
public void taskFailed() {
}
});
task.execute("http://www.yourdomain.com/api/getjson");
taskSuccessful - 성공, taskFailed - 실패
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android Activity에서 YouTube 동영상을 전체 화면으로 표시Android 개발이었던 한 가지 과제는 다음과 같습니다. 하나의 활동에 WebView가 있습니다. 그 WebView의 내용은 YouTube 동영상을 임베드한 Iframe입니다. 당연히 WebView 화면의 재생 버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.