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()
    }

+ Recent posts