AsyncTask Deplecated 되면서 소스에 항상 비활성화 코드로 보여서 거슬렸습니다.
그래서 찾아보니 대체할 기능이 있더라구요.
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
[기존 예제 소스]
class AsyncRes {
public String result = "";
public Exception e = null;
}
AsyncTask<Void, Void, AsyncRes> commTask = new AsyncTask<Void, Void, AsyncRes>() {
@Override
protected AsyncRes doInBackground(Void... voids) {
AsyncRes res = new AsyncRes();
try {
res.result = httpClient.postForm(url, params);
} catch (IOException e) {
Log.e("CustomCommHandler Error", e.getMessage());
res.e = e;
}
return res;
}
@Override
protected void onPostExecute(AsyncRes asyncRes) {
super.onPostExecute(asyncRes);
Log.d("LSM", "CustomCommHandler.onPostExecute - ");
if (asyncRes.e != null) {
listener.OnCompleteSuccess(ICompleteListener.ResultCode.FAIL, null, asyncRes.e.getMessage());
} else {
listener.OnCompleteSuccess(ICompleteListener.ResultCode.SUCCESS, null, asyncRes.result);
}
}
};
commTask.execute();
[대체 예제 소스]
소스에도 주석을 달아놨습니다.
Observable.fromCallable() -> {
// AsyncTask doInBackground 해당하는 부분
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((asyncRes) -> {
//AsyncTask onPostExecute 해당하는 부분
}
Disposable backgroundTask; // 클래스 맴버 변수 선언
class AsyncRes {
public String result = "";
public Exception e = null;
}
backgroundTask = Observable.fromCallable(() -> {
// AsyncTask doInBackground 해당하는 부분
AsyncRes res = new AsyncRes();
try {
res.result = httpClient.postForm(url, params);
DLog.d(new Exception(), "result 1 : " + res.result);
} catch (IOException e) {
res.e = e;
DLog.e(new Exception(), "result 1 : " + e.getMessage());
}
return res;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((asyncRes) -> {
//AsyncTask onPostExecute 해당하는 부분
if (asyncRes.e != null) {
listener.OnCompleteSuccess(ICompleteListener.ResultCode.FAIL, null, asyncRes.e.getMessage());
DLog.e(new Exception(), "result 2 : " + asyncRes.e.getMessage());
} else {
listener.OnCompleteSuccess(ICompleteListener.ResultCode.SUCCESS, null, asyncRes.result);
DLog.d(new Exception(), "result 2 : " + asyncRes.result);
}
// 이 부분은 데이터를 연속으로 두세번 들어오는 상황이라면 주석 처리해 주셔야 됩니다.
// 안그러면 처음 들어오고 그다음 들어오는 데이터가 안들오겠죠?
backgroundTask.dispose();
});
'Android(Java)' 카테고리의 다른 글
[JAVA] RxJava / retrofit2 이용한 API 서버 연동 (1) | 2024.11.27 |
---|---|
[Java] 하이브리드앱 웹페이지 PopupView에서 스크롤 시 Y값 0으로만 나올경우 (0) | 2024.10.24 |
[Java] FileProvider 설정 / 파일 저장 (2) | 2024.10.18 |
[Java] uses-feature 란? (0) | 2024.10.18 |
[Java] android.permission.QUERY_ALL_PACKAGES (0) | 2024.10.18 |