AsyncTask Deplecated 되면서 소스에 항상 비활성화 코드로 보여서 거슬렸습니다.
그래서 찾아보니 대체할 기능이 있더라구요.
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
[기존소스]
class AsyncRes {
var result: String = ""
var e: Exception? = null
}
val commTask: AsyncTask<Void, Void, AsyncRes> = object : AsyncTask<Void, Void, AsyncRes>() {
protected override fun doInBackground(vararg voids: Void): AsyncRes {
val res = AsyncRes()
try {
res.result = httpClient.postForm(url, params)
DLog.d(Exception(), "result 1 : ${res.result}")
} catch (e: IOException) {
res.e = e
DLog.e(Exception(), "result 1 : ${res.e}")
}
return res
}
override fun onPostExecute(asyncRes: AsyncRes) {
super.onPostExecute(asyncRes)
if (asyncRes.e != null) {
DLog.e(Exception(), "result 2 : ${asyncRes.e?.message}")
listener.OnCompleteSuccess(
ICompleteListener.ResultCode.FAIL,
null,
asyncRes.e?.message
)
} else {
DLog.d(Exception(), "result 2 : ${asyncRes.result}")
listener.OnCompleteSuccess(
ICompleteListener.ResultCode.SUCCESS,
null,
asyncRes.result
)
}
}
}
commTask.execute()
[대체 예제 소스]
소스에도 주석을 달아놨습니다.
Observable.fromCallable {
// AsyncTask doInBackground 해당하는 부분
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { asyncRes ->
//AsyncTask onPostExecute 해당하는 부분
}
var backgroundTask: Disposable? = null // 클래스 맴버 변수 선언
class AsyncRes {
var result: String = ""
var e: Exception? = null
}
backgroundTask = Observable.fromCallable {
// AsyncTask doInBackground 해당하는 부분
val res = AsyncRes()
try {
res.result = httpClient.postForm(url, params)
DLog.d(Exception(), "result 1 : ${res.result}")
} catch (e: IOException) {
res.e = e
DLog.e(Exception(), "result 1 : ${res.e}")
}
res // res return
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { asyncRes ->
//AsyncTask onPostExecute 해당하는 부분
if (asyncRes.e != null) {
DLog.e(Exception(), "result 2 : ${asyncRes.e?.message}")
listener.OnCompleteSuccess(
ICompleteListener.ResultCode.FAIL,
null,
asyncRes.e?.message
)
} else {
DLog.d(Exception(), "result 2 : ${asyncRes.result}")
listener.OnCompleteSuccess(
ICompleteListener.ResultCode.SUCCESS,
null,
asyncRes.result
)
}
// 이 부분은 데이터가 연속으로 두세번 들어오는 상황이라면 주석 처리해 주셔야 됩니다.
// 안그러면 처음 들어오고 그다음 들어오는 데이터가 안들오겠죠?
backgroundTask?.dispose()
}
'Android(Kotlin)' 카테고리의 다른 글
[Kotlin]windowManager.defaultDisplay.getRealMetrics DEPRECATION 대응 코드 (0) | 2024.12.18 |
---|---|
[Kotlin] windowManager.defaultDisplay.getSize DEPRECATION 대응 (1) | 2024.12.18 |
[Kotlin] RxJava / retrofit2 이용한 API 서버 연동 (0) | 2024.11.28 |
[Kotilin] 연산자 (Operators) (0) | 2024.11.13 |
[Kotlin] for / foreach / while / do while (0) | 2024.10.04 |