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

                });

+ Recent posts