2 개의 ASyncTask가 있습니다. 하나는 httpPost에서 값을 검색하고 다른 하나는 UI의 일부 요소 (목록보기 포함)를 업데이트합니다. 문제는 네트워크 동기화가 먼저 시작되고 네트워크 연결 불량으로 인해 두 ASyncTask가 동일한 백그라운드 스레드를 공유하기 때문에 문제입니다. 다른 배경 스레드는 앱을 무책임하게 만드는 데 너무 많은 시간이 걸립니다.다른 사람을 차단하는 ASyncTasks
두 ASyncTasks는 모두 독립적이기 때문에 다른 쪽을 기다리게 만드는 것은 매우 어리 석다. 그것은 더 논리적 인 asynctasks 다른 클래스가 다른 스레드를 사용하는 것입니다, 내가 틀렸어?
ASyncTask 문서를 읽는 중입니다. executeOnExecutor() 사용에 대해 이야기하지만, 11보다 낮은 API 레벨에서 어떻게 해결할 수 있습니까? 여기
는 "문제"로 new Task1().execute();
new Task2().execute();
을 재현 한 작은 예를 간다
public class Task1 extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 1");
SystemClock.sleep(9000);
GLog.e("doInBackground end 1");
return null;
}
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 1");
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 1");
super.onPostExecute(result);
}
}
public class Task2 extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 2");
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 2");
SystemClock.sleep(9000);
GLog.e("doInBackground end 2");
return null;
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 2");
super.onPostExecute(result);
}
}
UI를 업데이트하는 AsyncTask가있는 이유는 무엇입니까? 이 스레드에서 동기식으로 수행해야합니다. 귀하의 UI AsyncTask 백그라운드 스레드에서 다른 일을합니까? –
예를 들어 뉴스와 함께 목록보기를 표시하는 데 사용합니다. onPreExecute에서 백그라운드에서 loading() UI를 표시하고 인터넷에서 뉴스를 검색하고 onPostExecute에서 어댑터를 listview에 할당합니다. 그 접근 방식이 잘못 되었습니까? – Addev
@Addev : 첫 번째? onPostExecute (...) 메소드에서 두 번째 AsyncTask를 시작하는 것이 어떨까요? 필요한 경우 하나의 AsyncTask가 다른 AsyncTask의 결과에 의존한다는 것과 동기식 요구 사항을 효과적으로 가지며 두 개의 비동기 작업을 병렬로 실행하지 않아야한다는 것입니다. – Squonk